aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-dev.c
diff options
context:
space:
mode:
authorNick Dyer <nick@shmanahar.org>2016-07-18 17:10:30 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-08-23 15:28:04 -0400
commitb2fe22d0cf64708c50c26f11b3da8b79809c699b (patch)
treede7ba78bc3260c2af09a9ec6a2065497e8ea3088 /drivers/media/v4l2-core/v4l2-dev.c
parentaaf578e12e06160792ae5dd71dee3b074e0f9475 (diff)
[media] v4l2-core: Add support for touch devices
Some touch controllers send out touch data in a similar way to a greyscale frame grabber. Add new device type VFL_TYPE_TOUCH: - This uses a new device prefix v4l-touch for these devices, to stop generic capture software from treating them as webcams. Otherwise, touch is treated similarly to video capture. - Add V4L2_INPUT_TYPE_TOUCH - Add MEDIA_INTF_T_V4L_TOUCH - Add V4L2_CAP_TOUCH to indicate device is a touch device Add formats: - V4L2_TCH_FMT_DELTA_TD16 for signed 16-bit touch deltas - V4L2_TCH_FMT_DELTA_TD08 for signed 16-bit touch deltas - V4L2_TCH_FMT_TU16 for unsigned 16-bit touch data - V4L2_TCH_FMT_TU08 for unsigned 8-bit touch data This support will be used by: - Atmel maXTouch (atmel_mxt_ts) - Synaptics RMI4. - sur40 Signed-off-by: Nick Dyer <nick@shmanahar.org> Tested-by: Chris Healy <cphealy@gmail.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-dev.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-dev.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
index e6da353b39bc..8be561ab2615 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -527,6 +527,7 @@ static void determine_valid_ioctls(struct video_device *vdev)
527 bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI; 527 bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI;
528 bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO; 528 bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO;
529 bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR; 529 bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR;
530 bool is_tch = vdev->vfl_type == VFL_TYPE_TOUCH;
530 bool is_rx = vdev->vfl_dir != VFL_DIR_TX; 531 bool is_rx = vdev->vfl_dir != VFL_DIR_TX;
531 bool is_tx = vdev->vfl_dir != VFL_DIR_RX; 532 bool is_tx = vdev->vfl_dir != VFL_DIR_RX;
532 533
@@ -573,7 +574,7 @@ static void determine_valid_ioctls(struct video_device *vdev)
573 if (ops->vidioc_enum_freq_bands || ops->vidioc_g_tuner || ops->vidioc_g_modulator) 574 if (ops->vidioc_enum_freq_bands || ops->vidioc_g_tuner || ops->vidioc_g_modulator)
574 set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls); 575 set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls);
575 576
576 if (is_vid) { 577 if (is_vid || is_tch) {
577 /* video specific ioctls */ 578 /* video specific ioctls */
578 if ((is_rx && (ops->vidioc_enum_fmt_vid_cap || 579 if ((is_rx && (ops->vidioc_enum_fmt_vid_cap ||
579 ops->vidioc_enum_fmt_vid_cap_mplane || 580 ops->vidioc_enum_fmt_vid_cap_mplane ||
@@ -662,7 +663,7 @@ static void determine_valid_ioctls(struct video_device *vdev)
662 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); 663 set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
663 } 664 }
664 665
665 if (is_vid || is_vbi || is_sdr) { 666 if (is_vid || is_vbi || is_sdr || is_tch) {
666 /* ioctls valid for video, vbi or sdr */ 667 /* ioctls valid for video, vbi or sdr */
667 SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs); 668 SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs);
668 SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf); 669 SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf);
@@ -675,7 +676,7 @@ static void determine_valid_ioctls(struct video_device *vdev)
675 SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff); 676 SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
676 } 677 }
677 678
678 if (is_vid || is_vbi) { 679 if (is_vid || is_vbi || is_tch) {
679 /* ioctls valid for video or vbi */ 680 /* ioctls valid for video or vbi */
680 if (ops->vidioc_s_std) 681 if (ops->vidioc_s_std)
681 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls); 682 set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
@@ -751,6 +752,10 @@ static int video_register_media_controller(struct video_device *vdev, int type)
751 intf_type = MEDIA_INTF_T_V4L_SWRADIO; 752 intf_type = MEDIA_INTF_T_V4L_SWRADIO;
752 vdev->entity.function = MEDIA_ENT_F_IO_SWRADIO; 753 vdev->entity.function = MEDIA_ENT_F_IO_SWRADIO;
753 break; 754 break;
755 case VFL_TYPE_TOUCH:
756 intf_type = MEDIA_INTF_T_V4L_TOUCH;
757 vdev->entity.function = MEDIA_ENT_F_IO_V4L;
758 break;
754 case VFL_TYPE_RADIO: 759 case VFL_TYPE_RADIO:
755 intf_type = MEDIA_INTF_T_V4L_RADIO; 760 intf_type = MEDIA_INTF_T_V4L_RADIO;
756 /* 761 /*
@@ -854,6 +859,9 @@ int __video_register_device(struct video_device *vdev, int type, int nr,
854 /* Use device name 'swradio' because 'sdr' was already taken. */ 859 /* Use device name 'swradio' because 'sdr' was already taken. */
855 name_base = "swradio"; 860 name_base = "swradio";
856 break; 861 break;
862 case VFL_TYPE_TOUCH:
863 name_base = "v4l-touch";
864 break;
857 default: 865 default:
858 printk(KERN_ERR "%s called with unknown type: %d\n", 866 printk(KERN_ERR "%s called with unknown type: %d\n",
859 __func__, type); 867 __func__, type);