• Home
  • Raw
  • Download

Lines Matching +full:rmi4 +full:- +full:spi

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2015 Synaptics Incorporated
13 #include <media/v4l2-device.h>
14 #include <media/v4l2-ioctl.h>
15 #include <media/videobuf2-v4l2.h>
16 #include <media/videobuf2-vmalloc.h>
29 * But this should be fine for i2c/spi as well.
43 * enum rmi_f54_report_type - RMI4 F54 report types
45 * @F54_8BIT_IMAGE: Normalized 8-Bit Image Report. The capacitance variance
48 * @F54_16BIT_IMAGE: Normalized 16-Bit Image Report. The capacitance variance
52 * Raw 16-Bit Image Report. The raw capacitance for each
81 [F54_8BIT_IMAGE] = "Normalized 8-Bit Image",
82 [F54_16BIT_IMAGE] = "Normalized 16-Bit Image",
83 [F54_RAW_16BIT_IMAGE] = "Raw 16-Bit Image",
133 return f54->capabilities & F54_CAP_IMAGE8; in is_f54_report_type_valid()
136 return f54->capabilities & F54_CAP_IMAGE16; in is_f54_report_type_valid()
138 return f54->capabilities & F54_CAP_IMAGE16; in is_f54_report_type_valid()
153 return f54->inputs[i]; in rmi_f54_get_reptype()
165 f54->inputs[i++] = reptype; in rmi_f54_create_input_map()
173 struct f54_data *f54 = dev_get_drvdata(&fn->dev); in rmi_f54_request_report()
174 struct rmi_device *rmi_dev = fn->rmi_dev; in rmi_f54_request_report()
178 if (f54->report_type != report_type) { in rmi_f54_request_report()
179 error = rmi_write(rmi_dev, f54->fn->fd.data_base_addr, in rmi_f54_request_report()
183 f54->report_type = report_type; in rmi_f54_request_report()
193 mutex_lock(&f54->data_mutex); in rmi_f54_request_report()
195 error = rmi_write(rmi_dev, fn->fd.command_base_addr, F54_GET_REPORT); in rmi_f54_request_report()
199 init_completion(&f54->cmd_done); in rmi_f54_request_report()
201 f54->is_busy = 1; in rmi_f54_request_report()
202 f54->timeout = jiffies + msecs_to_jiffies(100); in rmi_f54_request_report()
204 queue_delayed_work(f54->workqueue, &f54->work, 0); in rmi_f54_request_report()
207 mutex_unlock(&f54->data_mutex); in rmi_f54_request_report()
214 struct rmi_device *rmi_dev = f54->fn->rmi_dev; in rmi_f54_get_report_size()
215 struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); in rmi_f54_get_report_size()
216 u8 rx = drv_data->num_rx_electrodes ? : f54->num_rx_electrodes; in rmi_f54_get_report_size()
217 u8 tx = drv_data->num_tx_electrodes ? : f54->num_tx_electrodes; in rmi_f54_get_report_size()
220 switch (rmi_f54_get_reptype(f54, f54->input)) { in rmi_f54_get_report_size()
260 ret = -EINVAL; in rmi_f54_get_pixel_fmt()
281 struct f54_data *f54 = q->drv_priv; in rmi_f54_queue_setup()
284 return sizes[0] < rmi_f54_get_report_size(f54) ? -EINVAL : 0; in rmi_f54_queue_setup()
295 struct f54_data *f54 = vb2_get_drv_priv(vb->vb2_queue); in rmi_f54_buffer_queue()
301 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()
348 mutex_unlock(&f54->data_mutex); in rmi_f54_buffer_queue()
350 vb->timestamp = ktime_get_ns(); in rmi_f54_buffer_queue()
351 vbuf->field = V4L2_FIELD_NONE; in rmi_f54_buffer_queue()
352 vbuf->sequence = f54->sequence++; in rmi_f54_buffer_queue()
354 mutex_unlock(&f54->status_mutex); in rmi_f54_buffer_queue()
361 f54->sequence = 0; in rmi_f54_stop_streaming()
387 strlcpy(cap->driver, F54_NAME, sizeof(cap->driver)); in rmi_f54_vidioc_querycap()
388 strlcpy(cap->card, SYNAPTICS_INPUT_DEVICE_NAME, sizeof(cap->card)); in rmi_f54_vidioc_querycap()
389 snprintf(cap->bus_info, sizeof(cap->bus_info), in rmi_f54_vidioc_querycap()
390 "rmi4:%s", dev_name(&f54->fn->dev)); in rmi_f54_vidioc_querycap()
401 reptype = rmi_f54_get_reptype(f54, i->index); in rmi_f54_vidioc_enum_input()
403 return -EINVAL; in rmi_f54_vidioc_enum_input()
405 i->type = V4L2_INPUT_TYPE_TOUCH; in rmi_f54_vidioc_enum_input()
407 strlcpy(i->name, rmi_f54_report_type_names[reptype], sizeof(i->name)); in rmi_f54_vidioc_enum_input()
413 struct rmi_device *rmi_dev = f54->fn->rmi_dev; in rmi_f54_set_input()
414 struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); in rmi_f54_set_input()
415 u8 rx = drv_data->num_rx_electrodes ? : f54->num_rx_electrodes; in rmi_f54_set_input()
416 u8 tx = drv_data->num_tx_electrodes ? : f54->num_tx_electrodes; in rmi_f54_set_input()
417 struct v4l2_pix_format *f = &f54->format; in rmi_f54_set_input()
423 return -EINVAL; in rmi_f54_set_input()
425 ret = rmi_f54_get_pixel_fmt(reptype, &f->pixelformat); in rmi_f54_set_input()
429 f54->input = i; in rmi_f54_set_input()
431 f->width = rx; in rmi_f54_set_input()
432 f->height = tx; in rmi_f54_set_input()
433 f->field = V4L2_FIELD_NONE; in rmi_f54_set_input()
434 f->colorspace = V4L2_COLORSPACE_RAW; in rmi_f54_set_input()
435 f->bytesperline = f->width * sizeof(u16); in rmi_f54_set_input()
436 f->sizeimage = f->width * f->height * sizeof(u16); in rmi_f54_set_input()
451 *i = f54->input; in rmi_f54_vidioc_g_input()
461 f->fmt.pix = f54->format; in rmi_f54_vidioc_fmt()
471 if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in rmi_f54_vidioc_enum_fmt()
472 return -EINVAL; in rmi_f54_vidioc_enum_fmt()
474 if (fmt->index) in rmi_f54_vidioc_enum_fmt()
475 return -EINVAL; in rmi_f54_vidioc_enum_fmt()
477 fmt->pixelformat = f54->format.pixelformat; in rmi_f54_vidioc_enum_fmt()
485 if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in rmi_f54_vidioc_g_parm()
486 return -EINVAL; in rmi_f54_vidioc_g_parm()
488 a->parm.capture.readbuffers = 1; in rmi_f54_vidioc_g_parm()
489 a->parm.capture.timeperframe.numerator = 1; in rmi_f54_vidioc_g_parm()
490 a->parm.capture.timeperframe.denominator = 10; in rmi_f54_vidioc_g_parm()
519 .name = "Synaptics RMI4",
530 struct rmi_function *fn = f54->fn; in rmi_f54_work()
539 dev_err(&fn->dev, "Bad report size, report type=%d\n", in rmi_f54_work()
540 f54->report_type); in rmi_f54_work()
541 error = -EINVAL; in rmi_f54_work()
545 mutex_lock(&f54->data_mutex); in rmi_f54_work()
551 error = rmi_read(fn->rmi_dev, f54->fn->fd.command_base_addr, in rmi_f54_work()
554 dev_err(&fn->dev, "Failed to read back command\n"); in rmi_f54_work()
558 if (time_after(jiffies, f54->timeout)) { in rmi_f54_work()
559 dev_err(&fn->dev, "Get report command timed out\n"); in rmi_f54_work()
560 error = -ETIMEDOUT; in rmi_f54_work()
566 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Get report command completed, reading data\n"); in rmi_f54_work()
569 int size = min(F54_REPORT_DATA_SIZE, report_size - i); in rmi_f54_work()
573 error = rmi_write_block(fn->rmi_dev, in rmi_f54_work()
574 fn->fd.data_base_addr + F54_FIFO_OFFSET, in rmi_f54_work()
577 dev_err(&fn->dev, "Failed to set fifo start offset\n"); in rmi_f54_work()
581 error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr + in rmi_f54_work()
583 f54->report_data + i, size); in rmi_f54_work()
585 dev_err(&fn->dev, "%s: read [%d bytes] returned %d\n", in rmi_f54_work()
592 f54->report_size = error ? 0 : report_size; in rmi_f54_work()
598 queue_delayed_work(f54->workqueue, &f54->work, in rmi_f54_work()
601 f54->is_busy = false; in rmi_f54_work()
602 complete(&f54->cmd_done); in rmi_f54_work()
605 mutex_unlock(&f54->data_mutex); in rmi_f54_work()
610 struct rmi_driver *drv = fn->rmi_dev->driver; in rmi_f54_config()
612 drv->clear_irq_bits(fn->rmi_dev, fn->irq_mask); in rmi_f54_config()
623 f54 = dev_get_drvdata(&fn->dev); in rmi_f54_detect()
625 error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr, in rmi_f54_detect()
628 dev_err(&fn->dev, "%s: Failed to query F54 properties\n", in rmi_f54_detect()
633 f54->num_rx_electrodes = buf[0]; in rmi_f54_detect()
634 f54->num_tx_electrodes = buf[1]; in rmi_f54_detect()
635 f54->capabilities = buf[2]; in rmi_f54_detect()
636 f54->clock_rate = buf[3] | (buf[4] << 8); in rmi_f54_detect()
637 f54->family = buf[5]; in rmi_f54_detect()
639 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F54 num_rx_electrodes: %d\n", in rmi_f54_detect()
640 f54->num_rx_electrodes); in rmi_f54_detect()
641 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F54 num_tx_electrodes: %d\n", in rmi_f54_detect()
642 f54->num_tx_electrodes); in rmi_f54_detect()
643 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F54 capabilities: 0x%x\n", in rmi_f54_detect()
644 f54->capabilities); in rmi_f54_detect()
645 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F54 clock rate: 0x%x\n", in rmi_f54_detect()
646 f54->clock_rate); in rmi_f54_detect()
647 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F54 family: 0x%x\n", in rmi_f54_detect()
648 f54->family); in rmi_f54_detect()
650 f54->is_busy = false; in rmi_f54_detect()
661 f54 = devm_kzalloc(&fn->dev, sizeof(struct f54_data), GFP_KERNEL); in rmi_f54_probe()
663 return -ENOMEM; in rmi_f54_probe()
665 f54->fn = fn; in rmi_f54_probe()
666 dev_set_drvdata(&fn->dev, f54); in rmi_f54_probe()
672 mutex_init(&f54->data_mutex); in rmi_f54_probe()
673 mutex_init(&f54->status_mutex); in rmi_f54_probe()
675 rx = f54->num_rx_electrodes; in rmi_f54_probe()
676 tx = f54->num_tx_electrodes; in rmi_f54_probe()
677 f54->report_data = devm_kzalloc(&fn->dev, in rmi_f54_probe()
680 if (f54->report_data == NULL) in rmi_f54_probe()
681 return -ENOMEM; in rmi_f54_probe()
683 INIT_DELAYED_WORK(&f54->work, rmi_f54_work); in rmi_f54_probe()
685 f54->workqueue = create_singlethread_workqueue("rmi4-poller"); in rmi_f54_probe()
686 if (!f54->workqueue) in rmi_f54_probe()
687 return -ENOMEM; in rmi_f54_probe()
693 strlcpy(f54->v4l2.name, F54_NAME, sizeof(f54->v4l2.name)); in rmi_f54_probe()
694 ret = v4l2_device_register(&fn->dev, &f54->v4l2); in rmi_f54_probe()
696 dev_err(&fn->dev, "Unable to register video dev.\n"); in rmi_f54_probe()
701 mutex_init(&f54->lock); in rmi_f54_probe()
702 f54->queue = rmi_f54_queue; in rmi_f54_probe()
703 f54->queue.drv_priv = f54; in rmi_f54_probe()
704 f54->queue.lock = &f54->lock; in rmi_f54_probe()
705 f54->queue.dev = &fn->dev; in rmi_f54_probe()
707 ret = vb2_queue_init(&f54->queue); in rmi_f54_probe()
711 f54->vdev = rmi_f54_video_device; in rmi_f54_probe()
712 f54->vdev.v4l2_dev = &f54->v4l2; in rmi_f54_probe()
713 f54->vdev.lock = &f54->lock; in rmi_f54_probe()
714 f54->vdev.vfl_dir = VFL_DIR_RX; in rmi_f54_probe()
715 f54->vdev.queue = &f54->queue; in rmi_f54_probe()
716 video_set_drvdata(&f54->vdev, f54); in rmi_f54_probe()
718 ret = video_register_device(&f54->vdev, VFL_TYPE_TOUCH, -1); in rmi_f54_probe()
720 dev_err(&fn->dev, "Unable to register video subdevice."); in rmi_f54_probe()
727 v4l2_device_unregister(&f54->v4l2); in rmi_f54_probe()
729 cancel_delayed_work_sync(&f54->work); in rmi_f54_probe()
730 flush_workqueue(f54->workqueue); in rmi_f54_probe()
731 destroy_workqueue(f54->workqueue); in rmi_f54_probe()
737 struct f54_data *f54 = dev_get_drvdata(&fn->dev); in rmi_f54_remove()
739 video_unregister_device(&f54->vdev); in rmi_f54_remove()
740 v4l2_device_unregister(&f54->v4l2); in rmi_f54_remove()
741 destroy_workqueue(f54->workqueue); in rmi_f54_remove()