The selection of which ioctls are valid for touch devices was too
wide. Refine this to only the set of ioctls that make sense for such
devices.

Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
---
This patch sits on top of Vandana's metadata patch:
https://patchwork.linuxtv.org/patch/58693/
---
 drivers/media/v4l2-core/v4l2-dev.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-dev.c 
b/drivers/media/v4l2-core/v4l2-dev.c
index 8110127d0e3d..1fbc4af0e5ef 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -575,7 +575,7 @@ static void determine_valid_ioctls(struct video_device 
*vdev)
                set_bit(_IOC_NR(VIDIOC_TRY_EXT_CTRLS), valid_ioctls);
        if (vdev->ctrl_handler || ops->vidioc_querymenu)
                set_bit(_IOC_NR(VIDIOC_QUERYMENU), valid_ioctls);
-       if (!is_meta) {
+       if (!is_tch && !is_meta) {
                SET_VALID_IOCTL(ops, VIDIOC_G_FREQUENCY, vidioc_g_frequency);
                SET_VALID_IOCTL(ops, VIDIOC_S_FREQUENCY, vidioc_s_frequency);
        }
@@ -592,7 +592,7 @@ static void determine_valid_ioctls(struct video_device 
*vdev)
        if (ops->vidioc_enum_freq_bands || ops->vidioc_g_tuner || 
ops->vidioc_g_modulator)
                set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls);

-       if (is_vid || is_tch) {
+       if (is_vid) {
                /* video and metadata specific ioctls */
                if ((is_rx && (ops->vidioc_enum_fmt_vid_cap ||
                               ops->vidioc_enum_fmt_vid_overlay)) ||
@@ -677,6 +677,19 @@ static void determine_valid_ioctls(struct video_device 
*vdev)
                        set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
                if (ops->vidioc_try_fmt_sdr_out)
                        set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
+       } else if (is_tch) {
+               /* touch specific ioctls */
+               set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
+               set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
+               set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
+               set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
+               SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input);
+               SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input);
+               SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input);
+               SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMESIZES, 
vidioc_enum_framesizes);
+               SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMEINTERVALS, 
vidioc_enum_frameintervals);
+               SET_VALID_IOCTL(ops, VIDIOC_G_PARM, vidioc_g_parm);
+               SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
        } else if (is_meta) {
                /* metadata specific ioctls */
                if ((is_rx && ops->vidioc_enum_fmt_meta_cap) ||
@@ -706,7 +719,7 @@ static void determine_valid_ioctls(struct video_device 
*vdev)
                SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
        }

-       if (is_vid || is_vbi || is_tch) {
+       if (is_vid || is_vbi) {
                /* ioctls valid for video or vbi */
                if (ops->vidioc_s_std)
                        set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
@@ -746,7 +759,7 @@ static void determine_valid_ioctls(struct video_device 
*vdev)
                SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator);
                SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator);
        }
-       if (is_rx && !is_meta) {
+       if (is_rx && !is_tch && !is_meta) {
                /* receiver only ioctls */
                SET_VALID_IOCTL(ops, VIDIOC_G_TUNER, vidioc_g_tuner);
                SET_VALID_IOCTL(ops, VIDIOC_S_TUNER, vidioc_s_tuner);
-- 
2.23.0.rc1

Reply via email to