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()
873 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_hidpp_dev_conn_notif_equad() local
888 if (djrcv_dev->type == recvr_type_mouse_only) in logi_hidpp_dev_conn_notif_equad()
922 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_hidpp_recv_queue_notif() local
996 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_hidpp_recv_queue_notif()
997 schedule_work(&djrcv_dev->work); in logi_hidpp_recv_queue_notif()
1000 static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_null_report() argument
1008 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_null_report()
1026 static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_dj() argument
1032 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_dj()
1058 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_recv_forward_input_report() local
1069 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1071 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_recv_forward_input_report()
1074 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1079 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_recv_forward_input_report()
1080 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_forward_input_report()
1085 static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_send_report() argument
1088 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_send_report()
1110 static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_hidpp_devices() argument
1127 retval = hid_hw_raw_request(djrcv_dev->hidpp, in logi_dj_recv_query_hidpp_devices()
1137 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_paired_devices() argument
1142 djrcv_dev->last_query = jiffies; in logi_dj_recv_query_paired_devices()
1144 if (djrcv_dev->type != recvr_type_dj) in logi_dj_recv_query_paired_devices()
1145 return logi_dj_recv_query_hidpp_devices(djrcv_dev); in logi_dj_recv_query_paired_devices()
1153 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_query_paired_devices()
1159 static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_switch_to_dj_mode() argument
1162 struct hid_device *hdev = djrcv_dev->hidpp; in logi_dj_recv_switch_to_dj_mode()
1171 if (djrcv_dev->type == recvr_type_dj) { in logi_dj_recv_switch_to_dj_mode()
1179 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_switch_to_dj_mode()
1249 struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev; in logi_dj_ll_raw_request() local
1266 return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf, in logi_dj_ll_raw_request()
1273 if (djrcv_dev->type != recvr_type_dj && count >= 2) { in logi_dj_ll_raw_request()
1274 if (!djrcv_dev->keyboard) { in logi_dj_ll_raw_request()
1279 return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count, in logi_dj_ll_raw_request()
1294 ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf, in logi_dj_ll_raw_request()
1406 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_dj_event() local
1441 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1443 if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) { in logi_dj_dj_event()
1445 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1454 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
1459 logi_dj_recv_forward_null_report(djrcv_dev, dj_report); in logi_dj_dj_event()
1463 logi_dj_recv_forward_dj(djrcv_dev, dj_report); in logi_dj_dj_event()
1467 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_dj_event()
1476 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_hidpp_event() local
1513 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1515 dj_dev = djrcv_dev->paired_dj_devices[device_index]; in logi_dj_hidpp_event()
1521 if (djrcv_dev->type == recvr_type_27mhz && dj_dev && in logi_dj_hidpp_event()
1530 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem)); in logi_dj_hidpp_event()
1541 logi_dj_recv_queue_unknown_work(djrcv_dev); in logi_dj_hidpp_event()
1544 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
1553 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_raw_event() local
1556 if (!djrcv_dev) in logi_dj_raw_event()
1561 if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) { in logi_dj_raw_event()
1580 if (djrcv_dev->unnumbered_application == HID_GD_MOUSE && in logi_dj_raw_event()
1631 struct dj_receiver_dev *djrcv_dev; in logi_dj_probe() local
1697 djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data, in logi_dj_probe()
1699 if (!djrcv_dev) { in logi_dj_probe()
1705 djrcv_dev->unnumbered_application = rep->application; in logi_dj_probe()
1716 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_probe()
1736 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_probe()
1737 djrcv_dev->ready = true; in logi_dj_probe()
1738 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_probe()
1739 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in logi_dj_probe()
1765 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_reset_resume() local
1767 if (!djrcv_dev || djrcv_dev->hidpp != hdev) in logi_dj_reset_resume()
1770 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_reset_resume()
1782 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_remove() local
1789 if (!djrcv_dev) in logi_dj_remove()
1796 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1797 djrcv_dev->ready = false; in logi_dj_remove()
1798 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()
1800 cancel_work_sync(&djrcv_dev->work); in logi_dj_remove()
1813 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_remove()
1814 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_remove()
1815 djrcv_dev->paired_dj_devices[i] = NULL; in logi_dj_remove()
1816 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_remove()