Lines Matching refs:djrcv_dev
343 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
345 static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_destroy_djhid_device() argument
352 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_recv_destroy_djhid_device()
353 dj_dev = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_destroy_djhid_device()
354 djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL; in logi_dj_recv_destroy_djhid_device()
355 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_recv_destroy_djhid_device()
361 dev_err(&djrcv_dev->hdev->dev, "%s: can't destroy a NULL device\n", in logi_dj_recv_destroy_djhid_device()
366 static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_add_djhid_device() argument
370 struct hid_device *djrcv_hdev = djrcv_dev->hdev; in logi_dj_recv_add_djhid_device()
384 djrcv_dev->querying_devices = false; in logi_dj_recv_add_djhid_device()
388 if (djrcv_dev->paired_dj_devices[dj_report->device_index]) { in logi_dj_recv_add_djhid_device()
431 dj_dev->dj_receiver_dev = djrcv_dev; in logi_dj_recv_add_djhid_device()
435 djrcv_dev->paired_dj_devices[dj_report->device_index] = dj_dev; in logi_dj_recv_add_djhid_device()
446 djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL; in logi_dj_recv_add_djhid_device()
454 struct dj_receiver_dev *djrcv_dev = in delayedwork_callback() local
464 spin_lock_irqsave(&djrcv_dev->lock, flags); in delayedwork_callback()
466 count = kfifo_out(&djrcv_dev->notif_fifo, &dj_report, in delayedwork_callback()
470 dev_err(&djrcv_dev->hdev->dev, "%s: workitem triggered without " in delayedwork_callback()
472 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
476 if (!kfifo_is_empty(&djrcv_dev->notif_fifo)) { in delayedwork_callback()
477 if (schedule_work(&djrcv_dev->work) == 0) { in delayedwork_callback()
483 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in delayedwork_callback()
487 logi_dj_recv_add_djhid_device(djrcv_dev, &dj_report); in delayedwork_callback()
490 logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report); in delayedwork_callback()
500 if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) { in delayedwork_callback()
503 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in delayedwork_callback()
508 dev_err(&djrcv_dev->hdev->dev, in delayedwork_callback()
516 static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_queue_notification() argument
521 kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report)); in logi_dj_recv_queue_notification()
523 if (schedule_work(&djrcv_dev->work) == 0) { in logi_dj_recv_queue_notification()
529 static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_null_report() argument
537 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_null_report()
555 static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_forward_report() argument
561 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index]; in logi_dj_recv_forward_report()
584 static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_send_report() argument
587 struct hid_device *hdev = djrcv_dev->hdev; in logi_dj_recv_send_report()
609 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) in logi_dj_recv_query_paired_devices() argument
615 if (djrcv_dev->querying_devices) in logi_dj_recv_query_paired_devices()
624 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_query_paired_devices()
630 static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, in logi_dj_recv_switch_to_dj_mode() argument
633 struct hid_device *hdev = djrcv_dev->hdev; in logi_dj_recv_switch_to_dj_mode()
646 retval = logi_dj_recv_send_report(djrcv_dev, dj_report); in logi_dj_recv_switch_to_dj_mode()
704 struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev; in logi_dj_ll_raw_request() local
720 return hid_hw_raw_request(djrcv_dev->hdev, reportnum, buf, in logi_dj_ll_raw_request()
738 ret = hid_hw_raw_request(djrcv_dev->hdev, out_buf[0], out_buf, in logi_dj_ll_raw_request()
835 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_dj_event() local
870 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_dj_event()
872 if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) { in logi_dj_dj_event()
874 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
883 logi_dj_recv_queue_notification(djrcv_dev, dj_report); in logi_dj_dj_event()
888 logi_dj_recv_forward_null_report(djrcv_dev, dj_report); in logi_dj_dj_event()
892 logi_dj_recv_forward_report(djrcv_dev, dj_report); in logi_dj_dj_event()
896 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_dj_event()
905 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_hidpp_event() local
942 spin_lock_irqsave(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
944 if (!djrcv_dev->paired_dj_devices[device_index]) in logi_dj_hidpp_event()
948 logi_dj_recv_forward_hidpp(djrcv_dev->paired_dj_devices[device_index], in logi_dj_hidpp_event()
952 spin_unlock_irqrestore(&djrcv_dev->lock, flags); in logi_dj_hidpp_event()
993 struct dj_receiver_dev *djrcv_dev; in logi_dj_probe() local
1010 djrcv_dev = kzalloc(sizeof(struct dj_receiver_dev), GFP_KERNEL); in logi_dj_probe()
1011 if (!djrcv_dev) { in logi_dj_probe()
1016 djrcv_dev->hdev = hdev; in logi_dj_probe()
1017 INIT_WORK(&djrcv_dev->work, delayedwork_callback); in logi_dj_probe()
1018 spin_lock_init(&djrcv_dev->lock); in logi_dj_probe()
1019 if (kfifo_alloc(&djrcv_dev->notif_fifo, in logi_dj_probe()
1024 kfree(djrcv_dev); in logi_dj_probe()
1027 hid_set_drvdata(hdev, djrcv_dev); in logi_dj_probe()
1055 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_probe()
1074 retval = logi_dj_recv_query_paired_devices(djrcv_dev); in logi_dj_probe()
1092 kfifo_free(&djrcv_dev->notif_fifo); in logi_dj_probe()
1093 kfree(djrcv_dev); in logi_dj_probe()
1103 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_reset_resume() local
1105 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0); in logi_dj_reset_resume()
1118 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); in logi_dj_remove() local
1124 cancel_work_sync(&djrcv_dev->work); in logi_dj_remove()
1135 dj_dev = djrcv_dev->paired_dj_devices[i]; in logi_dj_remove()
1139 djrcv_dev->paired_dj_devices[i] = NULL; in logi_dj_remove()
1143 kfifo_free(&djrcv_dev->notif_fifo); in logi_dj_remove()
1144 kfree(djrcv_dev); in logi_dj_remove()