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
1021 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_hidpp_recv_queue_notif()
1022 schedule_work(&djrcv_dev->work); in logi_hidpp_recv_queue_notif()
1025 static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_null_report() argument
1033 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_null_report()
1051 static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_dj() argument
1057 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_dj()
1083 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_recv_forward_input_report() local
1094 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1096 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_recv_forward_input_report()
1099 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1104 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_recv_forward_input_report()
1105 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1110 static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_send_report() argument
1113 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_send_report()
1135 static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_hidpp_devices() argument
1152 retval = hid_hw_raw_request(djrcv_dev->hidpp, in logi_dj_recv_query_hidpp_devices()
1162 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_paired_devices() argument
1167 djrcv_dev->last_query = jiffies; in logi_dj_recv_query_paired_devices()
1169 if (djrcv_dev->type != recvr_type_dj) in logi_dj_recv_query_paired_devices()
1170 return logi_dj_recv_query_hidpp_devices(djrcv_dev); in logi_dj_recv_query_paired_devices()
1178 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_query_paired_devices()
1184 static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_switch_to_dj_mode() argument
1187 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_switch_to_dj_mode()
1196 if (djrcv_dev->type == recvr_type_dj) { in logi_dj_recv_switch_to_dj_mode()
1204 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_switch_to_dj_mode()
1274 struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev; in logi_dj_ll_raw_request() local
1291 return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf, in logi_dj_ll_raw_request()
1298 if (djrcv_dev->type != recvr_type_dj && count >= 2) { in logi_dj_ll_raw_request()
1299 if (!djrcv_dev->keyboard) { in logi_dj_ll_raw_request()
1304 return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count, in logi_dj_ll_raw_request()
1319 ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf, in logi_dj_ll_raw_request()
1433 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_dj_event() local
1468 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1470 if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) { in logi_dj_dj_event()
1472 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1481 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1486 logi_dj_recv_forward_null_report(djrcv_dev, dj_report); in logi_dj_dj_event()
1490 logi_dj_recv_forward_dj(djrcv_dev, dj_report); in logi_dj_dj_event()
1494 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1503 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_hidpp_event() local
1540 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1542 dj_dev = djrcv_dev->paired_dj_devices[device_index]; in logi_dj_hidpp_event()
1548 if (djrcv_dev->type == recvr_type_27mhz && dj_dev && in logi_dj_hidpp_event()
1557 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_hidpp_event()
1568 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_hidpp_event()
1571 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1580 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_raw_event() local
1583 if (!djrcv_dev) in logi_dj_raw_event()
1588 if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) { in logi_dj_raw_event()
1607 if (djrcv_dev->unnumbered_application == HID_GD_MOUSE && in logi_dj_raw_event()
1658 struct dj_receiver_dev *djrcv_dev; in logi_dj_probe() local
1724 djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data, in logi_dj_probe()
1726 if (!djrcv_dev) { in logi_dj_probe()
1732 djrcv_dev->unnumbered_application = rep->application; in logi_dj_probe()
1743 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_probe()
1763 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_probe()
1764 djrcv_dev->ready = true; in logi_dj_probe()
1765 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_probe()
1766 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in logi_dj_probe()
1792 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_reset_resume() local
1794 if (!djrcv_dev || djrcv_dev->hidpp != hdev) in logi_dj_reset_resume()
1797 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_reset_resume()
1809 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_remove() local
1816 if (!djrcv_dev) in logi_dj_remove()
1823 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1824 djrcv_dev->ready = false; in logi_dj_remove()
1825 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()
1827 cancel_work_sync(&djrcv_dev->work); in logi_dj_remove()
1840 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1841 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_remove()
1842 djrcv_dev->paired_dj_devices[i] = NULL; in logi_dj_remove()
1843 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()