diff options
author | Nick Dyer <nick@shmanahar.org> | 2016-07-18 17:10:30 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-08-23 15:28:04 -0400 |
commit | b2fe22d0cf64708c50c26f11b3da8b79809c699b (patch) | |
tree | de7ba78bc3260c2af09a9ec6a2065497e8ea3088 /drivers/media/v4l2-core/v4l2-dev.c | |
parent | aaf578e12e06160792ae5dd71dee3b074e0f9475 (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.c | 14 |
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); |