Lines Matching refs:djrcv_dev

559 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
580 struct dj_receiver_dev *djrcv_dev; in dj_find_receiver_dev() local
590 list_for_each_entry(djrcv_dev, &dj_hdev_list, list) { in dj_find_receiver_dev()
591 if (djrcv_dev->mouse && in dj_find_receiver_dev()
592 hid_compare_device_paths(hdev, djrcv_dev->mouse, sep)) { in dj_find_receiver_dev()
593 kref_get(&djrcv_dev->kref); in dj_find_receiver_dev()
594 return djrcv_dev; in dj_find_receiver_dev()
596 if (djrcv_dev->keyboard && in dj_find_receiver_dev()
597 hid_compare_device_paths(hdev, djrcv_dev->keyboard, sep)) { in dj_find_receiver_dev()
598 kref_get(&djrcv_dev->kref); in dj_find_receiver_dev()
599 return djrcv_dev; in dj_find_receiver_dev()
601 if (djrcv_dev->hidpp && in dj_find_receiver_dev()
602 hid_compare_device_paths(hdev, djrcv_dev->hidpp, sep)) { in dj_find_receiver_dev()
603 kref_get(&djrcv_dev->kref); in dj_find_receiver_dev()
604 return djrcv_dev; in dj_find_receiver_dev()
613 struct dj_receiver_dev *djrcv_dev = container_of(kref, struct dj_receiver_dev, kref); in dj_release_receiver_dev() local
615 list_del(&djrcv_dev->list); in dj_release_receiver_dev()
616 kfifo_free(&djrcv_dev->notif_fifo); in dj_release_receiver_dev()
617 kfree(djrcv_dev); in dj_release_receiver_dev()
622 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in dj_put_receiver_dev() local
626 if (djrcv_dev->mouse == hdev) in dj_put_receiver_dev()
627 djrcv_dev->mouse = NULL; in dj_put_receiver_dev()
628 if (djrcv_dev->keyboard == hdev) in dj_put_receiver_dev()
629 djrcv_dev->keyboard = NULL; in dj_put_receiver_dev()
630 if (djrcv_dev->hidpp == hdev) in dj_put_receiver_dev()
631 djrcv_dev->hidpp = NULL; in dj_put_receiver_dev()
633 kref_put(&djrcv_dev->kref, dj_release_receiver_dev); in dj_put_receiver_dev()
643 struct dj_receiver_dev *djrcv_dev; in dj_get_receiver_dev() local
647 djrcv_dev = dj_find_receiver_dev(hdev, type); in dj_get_receiver_dev()
648 if (!djrcv_dev) { in dj_get_receiver_dev()
649 djrcv_dev = kzalloc(sizeof(*djrcv_dev), GFP_KERNEL); in dj_get_receiver_dev()
650 if (!djrcv_dev) in dj_get_receiver_dev()
653 INIT_WORK(&djrcv_dev->work, delayedwork_callback); in dj_get_receiver_dev()
654 spin_lock_init(&djrcv_dev->lock); in dj_get_receiver_dev()
655 if (kfifo_alloc(&djrcv_dev->notif_fifo, in dj_get_receiver_dev()
658 kfree(djrcv_dev); in dj_get_receiver_dev()
659 djrcv_dev = NULL; in dj_get_receiver_dev()
662 kref_init(&djrcv_dev->kref); in dj_get_receiver_dev()
663 list_add_tail(&djrcv_dev->list, &dj_hdev_list); in dj_get_receiver_dev()
664 djrcv_dev->last_query = jiffies; in dj_get_receiver_dev()
665 djrcv_dev->type = type; in dj_get_receiver_dev()
669 djrcv_dev->keyboard = hdev; in dj_get_receiver_dev()
671 djrcv_dev->mouse = hdev; in dj_get_receiver_dev()
673 djrcv_dev->hidpp = hdev; in dj_get_receiver_dev()
675 hid_set_drvdata(hdev, djrcv_dev); in dj_get_receiver_dev()
678 return djrcv_dev; in dj_get_receiver_dev()
681 static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_destroy_djhid_device() argument
688 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_destroy_djhid_device()
689 dj_dev = djrcv_dev->paired_dj_devices[workitem->device_index]; in logi_dj_recv_destroy_djhid_device()
690 djrcv_dev->paired_dj_devices[workitem->device_index] = NULL; in logi_dj_recv_destroy_djhid_device()
691 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_destroy_djhid_device()
697 hid_err(djrcv_dev->hidpp, "%s: can't destroy a NULL device\n", in logi_dj_recv_destroy_djhid_device()
702 static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_add_djhid_device() argument
706 struct hid_device *djrcv_hdev = djrcv_dev->hidpp; in logi_dj_recv_add_djhid_device()
718 if (djrcv_dev->paired_dj_devices[device_index]) { in logi_dj_recv_add_djhid_device()
758 if (djrcv_dev->type == recvr_type_27mhz) in logi_dj_recv_add_djhid_device()
776 dj_dev->dj_receiver_dev = djrcv_dev; in logi_dj_recv_add_djhid_device()
780 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
781 djrcv_dev->paired_dj_devices[device_index] = dj_dev; in logi_dj_recv_add_djhid_device()
782 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
792 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
793 djrcv_dev->paired_dj_devices[device_index] = NULL; in logi_dj_recv_add_djhid_device()
794 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_add_djhid_device()
802 struct dj_receiver_dev *djrcv_dev = in delayedwork_callback() local
812 spin_lock_irqsave(&djrcv_dev->lock, flags); in delayedwork_callback()
818 if (!djrcv_dev->ready) { in delayedwork_callback()
821 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
825 count = kfifo_out(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in delayedwork_callback()
828 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
832 if (!kfifo_is_empty(&djrcv_dev->notif_fifo)) in delayedwork_callback()
833 schedule_work(&djrcv_dev->work); in delayedwork_callback()
835 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
839 logi_dj_recv_add_djhid_device(djrcv_dev, &workitem); in delayedwork_callback()
842 logi_dj_recv_destroy_djhid_device(djrcv_dev, &workitem); in delayedwork_callback()
845 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in delayedwork_callback()
847 hid_err(djrcv_dev->hidpp, "%s: logi_dj_recv_query_paired_devices error: %d\n", in delayedwork_callback()
869 static void logi_dj_recv_queue_unknown_work(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_queue_unknown_work() argument
874 if (time_before(jiffies, djrcv_dev->last_query + HZ / 2)) in logi_dj_recv_queue_unknown_work()
877 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_recv_queue_unknown_work()
878 schedule_work(&djrcv_dev->work); in logi_dj_recv_queue_unknown_work()
881 static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_queue_notification() argument
911 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_recv_queue_notification()
915 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_recv_queue_notification()
916 schedule_work(&djrcv_dev->work); in logi_dj_recv_queue_notification()
943 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_hidpp_dev_conn_notif_equad() local
959 if (djrcv_dev->type == recvr_type_dinovo) in logi_hidpp_dev_conn_notif_equad()
1008 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_hidpp_recv_queue_notif() local
1094 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_hidpp_recv_queue_notif()
1095 schedule_work(&djrcv_dev->work); in logi_hidpp_recv_queue_notif()
1098 static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_null_report() argument
1106 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_null_report()
1124 static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_dj() argument
1130 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_dj()
1156 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_recv_forward_input_report() local
1167 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1169 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_recv_forward_input_report()
1172 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1177 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_recv_forward_input_report()
1178 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1183 static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_send_report() argument
1186 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_send_report()
1208 static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_hidpp_devices() argument
1225 retval = hid_hw_raw_request(djrcv_dev->hidpp, in logi_dj_recv_query_hidpp_devices()
1235 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_paired_devices() argument
1240 djrcv_dev->last_query = jiffies; in logi_dj_recv_query_paired_devices()
1242 if (djrcv_dev->type != recvr_type_dj) in logi_dj_recv_query_paired_devices()
1243 return logi_dj_recv_query_hidpp_devices(djrcv_dev); in logi_dj_recv_query_paired_devices()
1251 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_query_paired_devices()
1257 static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_switch_to_dj_mode() argument
1260 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_switch_to_dj_mode()
1269 if (djrcv_dev->type == recvr_type_dj) { in logi_dj_recv_switch_to_dj_mode()
1277 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_switch_to_dj_mode()
1352 struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev; in logi_dj_ll_raw_request() local
1369 return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf, in logi_dj_ll_raw_request()
1376 if (djrcv_dev->type != recvr_type_dj && count >= 2) { in logi_dj_ll_raw_request()
1377 if (!djrcv_dev->keyboard) { in logi_dj_ll_raw_request()
1382 return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count, in logi_dj_ll_raw_request()
1397 ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf, in logi_dj_ll_raw_request()
1507 struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev; in logi_dj_ll_may_wakeup() local
1509 return hid_hw_may_wakeup(djrcv_dev->hidpp); in logi_dj_ll_may_wakeup()
1526 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_dj_event() local
1561 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1563 if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) { in logi_dj_dj_event()
1565 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1574 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1579 logi_dj_recv_forward_null_report(djrcv_dev, dj_report); in logi_dj_dj_event()
1583 logi_dj_recv_forward_dj(djrcv_dev, dj_report); in logi_dj_dj_event()
1587 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1596 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_hidpp_event() local
1633 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1635 dj_dev = djrcv_dev->paired_dj_devices[device_index]; in logi_dj_hidpp_event()
1641 if (djrcv_dev->type == recvr_type_27mhz && dj_dev && in logi_dj_hidpp_event()
1650 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_hidpp_event()
1661 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_hidpp_event()
1664 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1673 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_raw_event() local
1676 if (!djrcv_dev) in logi_dj_raw_event()
1681 if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) { in logi_dj_raw_event()
1700 if (djrcv_dev->unnumbered_application == HID_GD_MOUSE && in logi_dj_raw_event()
1751 struct dj_receiver_dev *djrcv_dev; in logi_dj_probe() local
1818 djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data, in logi_dj_probe()
1820 if (!djrcv_dev) { in logi_dj_probe()
1826 djrcv_dev->unnumbered_application = rep->application; in logi_dj_probe()
1837 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_probe()
1857 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_probe()
1858 djrcv_dev->ready = true; in logi_dj_probe()
1859 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_probe()
1860 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in logi_dj_probe()
1886 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_reset_resume() local
1888 if (!djrcv_dev || djrcv_dev->hidpp != hdev) in logi_dj_reset_resume()
1891 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_reset_resume()
1903 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_remove() local
1910 if (!djrcv_dev) in logi_dj_remove()
1917 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1918 djrcv_dev->ready = false; in logi_dj_remove()
1919 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()
1921 cancel_work_sync(&djrcv_dev->work); in logi_dj_remove()
1934 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1935 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_remove()
1936 djrcv_dev->paired_dj_devices[i] = NULL; in logi_dj_remove()
1937 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()