Lines Matching refs:f54
130 static bool is_f54_report_type_valid(struct f54_data *f54, in is_f54_report_type_valid() argument
135 return f54->capabilities & F54_CAP_IMAGE8; in is_f54_report_type_valid()
138 return f54->capabilities & F54_CAP_IMAGE16; in is_f54_report_type_valid()
140 return f54->capabilities & F54_CAP_IMAGE16; in is_f54_report_type_valid()
149 static enum rmi_f54_report_type rmi_f54_get_reptype(struct f54_data *f54, in rmi_f54_get_reptype() argument
155 return f54->inputs[i]; in rmi_f54_get_reptype()
158 static void rmi_f54_create_input_map(struct f54_data *f54) in rmi_f54_create_input_map() argument
164 if (!is_f54_report_type_valid(f54, reptype)) in rmi_f54_create_input_map()
167 f54->inputs[i++] = reptype; in rmi_f54_create_input_map()
175 struct f54_data *f54 = dev_get_drvdata(&fn->dev); in rmi_f54_request_report() local
180 if (f54->report_type != report_type) { in rmi_f54_request_report()
181 error = rmi_write(rmi_dev, f54->fn->fd.data_base_addr, in rmi_f54_request_report()
185 f54->report_type = report_type; in rmi_f54_request_report()
195 mutex_lock(&f54->data_mutex); in rmi_f54_request_report()
201 init_completion(&f54->cmd_done); in rmi_f54_request_report()
203 f54->is_busy = 1; in rmi_f54_request_report()
204 f54->timeout = jiffies + msecs_to_jiffies(100); in rmi_f54_request_report()
206 queue_delayed_work(f54->workqueue, &f54->work, 0); in rmi_f54_request_report()
209 mutex_unlock(&f54->data_mutex); in rmi_f54_request_report()
214 static size_t rmi_f54_get_report_size(struct f54_data *f54) in rmi_f54_get_report_size() argument
216 struct rmi_device *rmi_dev = f54->fn->rmi_dev; in rmi_f54_get_report_size()
218 u8 rx = drv_data->num_rx_electrodes ? : f54->num_rx_electrodes; in rmi_f54_get_report_size()
219 u8 tx = drv_data->num_tx_electrodes ? : f54->num_tx_electrodes; in rmi_f54_get_report_size()
222 switch (rmi_f54_get_reptype(f54, f54->input)) { in rmi_f54_get_report_size()
283 struct f54_data *f54 = q->drv_priv; in rmi_f54_queue_setup() local
286 return sizes[0] < rmi_f54_get_report_size(f54) ? -EINVAL : 0; in rmi_f54_queue_setup()
289 sizes[0] = rmi_f54_get_report_size(f54); in rmi_f54_queue_setup()
296 struct f54_data *f54 = vb2_get_drv_priv(vb->vb2_queue); in rmi_f54_buffer_queue() local
302 mutex_lock(&f54->status_mutex); in rmi_f54_buffer_queue()
304 reptype = rmi_f54_get_reptype(f54, f54->input); in rmi_f54_buffer_queue()
310 if (f54->is_busy) { in rmi_f54_buffer_queue()
315 ret = rmi_f54_request_report(f54->fn, reptype); in rmi_f54_buffer_queue()
317 dev_err(&f54->fn->dev, "Error requesting F54 report\n"); in rmi_f54_buffer_queue()
323 mutex_lock(&f54->data_mutex); in rmi_f54_buffer_queue()
325 while (f54->is_busy) { in rmi_f54_buffer_queue()
326 mutex_unlock(&f54->data_mutex); in rmi_f54_buffer_queue()
327 if (!wait_for_completion_timeout(&f54->cmd_done, in rmi_f54_buffer_queue()
329 dev_err(&f54->fn->dev, "Timed out\n"); in rmi_f54_buffer_queue()
333 mutex_lock(&f54->data_mutex); in rmi_f54_buffer_queue()
338 dev_err(&f54->fn->dev, "Error acquiring frame ptr\n"); in rmi_f54_buffer_queue()
343 memcpy(ptr, f54->report_data, f54->report_size); in rmi_f54_buffer_queue()
344 vb2_set_plane_payload(vb, 0, rmi_f54_get_report_size(f54)); in rmi_f54_buffer_queue()
348 mutex_unlock(&f54->data_mutex); in rmi_f54_buffer_queue()
351 mutex_unlock(&f54->status_mutex); in rmi_f54_buffer_queue()
375 struct f54_data *f54 = video_drvdata(file); in rmi_f54_vidioc_querycap() local
380 "rmi4:%s", dev_name(&f54->fn->dev)); in rmi_f54_vidioc_querycap()
388 struct f54_data *f54 = video_drvdata(file); in rmi_f54_vidioc_enum_input() local
391 reptype = rmi_f54_get_reptype(f54, i->index); in rmi_f54_vidioc_enum_input()
401 static int rmi_f54_set_input(struct f54_data *f54, unsigned int i) in rmi_f54_set_input() argument
403 struct rmi_device *rmi_dev = f54->fn->rmi_dev; in rmi_f54_set_input()
405 u8 rx = drv_data->num_rx_electrodes ? : f54->num_rx_electrodes; in rmi_f54_set_input()
406 u8 tx = drv_data->num_tx_electrodes ? : f54->num_tx_electrodes; in rmi_f54_set_input()
407 struct v4l2_pix_format *f = &f54->format; in rmi_f54_set_input()
411 reptype = rmi_f54_get_reptype(f54, i); in rmi_f54_set_input()
419 f54->input = i; in rmi_f54_set_input()
439 struct f54_data *f54 = video_drvdata(file); in rmi_f54_vidioc_g_input() local
441 *i = f54->input; in rmi_f54_vidioc_g_input()
449 struct f54_data *f54 = video_drvdata(file); in rmi_f54_vidioc_fmt() local
451 f->fmt.pix = f54->format; in rmi_f54_vidioc_fmt()
529 struct f54_data *f54 = container_of(work, struct f54_data, work.work); in rmi_f54_work() local
530 struct rmi_function *fn = f54->fn; in rmi_f54_work()
538 data = f54->report_data; in rmi_f54_work()
539 report_size = rmi_f54_get_report_size(f54); in rmi_f54_work()
542 f54->report_type); in rmi_f54_work()
546 f54->standard_report[0].size = report_size; in rmi_f54_work()
547 report = f54->standard_report; in rmi_f54_work()
549 mutex_lock(&f54->data_mutex); in rmi_f54_work()
555 error = rmi_read(fn->rmi_dev, f54->fn->fd.command_base_addr, in rmi_f54_work()
562 if (time_after(jiffies, f54->timeout)) { in rmi_f54_work()
597 f54->report_size = error ? 0 : report_size; in rmi_f54_work()
603 queue_delayed_work(f54->workqueue, &f54->work, in rmi_f54_work()
606 f54->is_busy = false; in rmi_f54_work()
607 complete(&f54->cmd_done); in rmi_f54_work()
610 mutex_unlock(&f54->data_mutex); in rmi_f54_work()
625 struct f54_data *f54; in rmi_f54_detect() local
628 f54 = dev_get_drvdata(&fn->dev); in rmi_f54_detect()
638 f54->num_rx_electrodes = buf[0]; in rmi_f54_detect()
639 f54->num_tx_electrodes = buf[1]; in rmi_f54_detect()
640 f54->capabilities = buf[2]; in rmi_f54_detect()
641 f54->clock_rate = buf[3] | (buf[4] << 8); in rmi_f54_detect()
642 f54->family = buf[5]; in rmi_f54_detect()
645 f54->num_rx_electrodes); in rmi_f54_detect()
647 f54->num_tx_electrodes); in rmi_f54_detect()
649 f54->capabilities); in rmi_f54_detect()
651 f54->clock_rate); in rmi_f54_detect()
653 f54->family); in rmi_f54_detect()
655 f54->is_busy = false; in rmi_f54_detect()
662 struct f54_data *f54; in rmi_f54_probe() local
666 f54 = devm_kzalloc(&fn->dev, sizeof(struct f54_data), GFP_KERNEL); in rmi_f54_probe()
667 if (!f54) in rmi_f54_probe()
670 f54->fn = fn; in rmi_f54_probe()
671 dev_set_drvdata(&fn->dev, f54); in rmi_f54_probe()
677 mutex_init(&f54->data_mutex); in rmi_f54_probe()
678 mutex_init(&f54->status_mutex); in rmi_f54_probe()
680 rx = f54->num_rx_electrodes; in rmi_f54_probe()
681 tx = f54->num_tx_electrodes; in rmi_f54_probe()
682 f54->report_data = devm_kzalloc(&fn->dev, in rmi_f54_probe()
685 if (f54->report_data == NULL) in rmi_f54_probe()
688 INIT_DELAYED_WORK(&f54->work, rmi_f54_work); in rmi_f54_probe()
690 f54->workqueue = create_singlethread_workqueue("rmi4-poller"); in rmi_f54_probe()
691 if (!f54->workqueue) in rmi_f54_probe()
694 rmi_f54_create_input_map(f54); in rmi_f54_probe()
697 strlcpy(f54->v4l2.name, F54_NAME, sizeof(f54->v4l2.name)); in rmi_f54_probe()
698 ret = v4l2_device_register(&fn->dev, &f54->v4l2); in rmi_f54_probe()
705 mutex_init(&f54->lock); in rmi_f54_probe()
706 f54->queue = rmi_f54_queue; in rmi_f54_probe()
707 f54->queue.drv_priv = f54; in rmi_f54_probe()
708 f54->queue.lock = &f54->lock; in rmi_f54_probe()
709 f54->queue.dev = &fn->dev; in rmi_f54_probe()
711 ret = vb2_queue_init(&f54->queue); in rmi_f54_probe()
715 f54->vdev = rmi_f54_video_device; in rmi_f54_probe()
716 f54->vdev.v4l2_dev = &f54->v4l2; in rmi_f54_probe()
717 f54->vdev.lock = &f54->lock; in rmi_f54_probe()
718 f54->vdev.vfl_dir = VFL_DIR_RX; in rmi_f54_probe()
719 f54->vdev.queue = &f54->queue; in rmi_f54_probe()
720 video_set_drvdata(&f54->vdev, f54); in rmi_f54_probe()
722 ret = video_register_device(&f54->vdev, VFL_TYPE_TOUCH, -1); in rmi_f54_probe()
731 v4l2_device_unregister(&f54->v4l2); in rmi_f54_probe()
733 cancel_delayed_work_sync(&f54->work); in rmi_f54_probe()
734 flush_workqueue(f54->workqueue); in rmi_f54_probe()
735 destroy_workqueue(f54->workqueue); in rmi_f54_probe()
741 struct f54_data *f54 = dev_get_drvdata(&fn->dev); in rmi_f54_remove() local
743 video_unregister_device(&f54->vdev); in rmi_f54_remove()
744 v4l2_device_unregister(&f54->v4l2); in rmi_f54_remove()