Touch devices mark too many ioctls as valid. Restrict the list of
valid ioctls for touch devices.

Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
---
 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 c7132eb72071..fd6792cb0d57 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -590,8 +590,8 @@ 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) {
-               /* video and touch specific ioctls */
+       if (is_vid) {
+               /* video specific ioctls */
                if ((is_rx && (ops->vidioc_enum_fmt_vid_cap ||
                               ops->vidioc_enum_fmt_vid_overlay)) ||
                    (is_tx && ops->vidioc_enum_fmt_vid_out))
@@ -667,6 +667,19 @@ static void determine_valid_ioctls(struct video_device 
*vdev)
                SET_VALID_IOCTL(ops, VIDIOC_G_FMT, vidioc_g_fmt_sdr_out);
                SET_VALID_IOCTL(ops, VIDIOC_S_FMT, vidioc_s_fmt_sdr_out);
                SET_VALID_IOCTL(ops, VIDIOC_TRY_FMT, vidioc_try_fmt_sdr_out);
+       } else if (is_tch) {
+               /* touch specific ioctls */
+               SET_VALID_IOCTL(ops, VIDIOC_ENUM_FMT, vidioc_enum_fmt_vid_cap);
+               SET_VALID_IOCTL(ops, VIDIOC_G_FMT, vidioc_g_fmt_vid_cap);
+               SET_VALID_IOCTL(ops, VIDIOC_S_FMT, vidioc_s_fmt_vid_cap);
+               SET_VALID_IOCTL(ops, VIDIOC_TRY_FMT, vidioc_try_fmt_vid_cap);
+               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_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_G_PARM, vidioc_g_parm);
+               SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
        } else if (is_meta && is_rx) {
                /* metadata capture specific ioctls */
                SET_VALID_IOCTL(ops, VIDIOC_ENUM_FMT, vidioc_enum_fmt_meta_cap);
@@ -694,8 +707,8 @@ static void determine_valid_ioctls(struct video_device 
*vdev)
                SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
        }
 
-       if (is_vid || is_vbi || is_tch || is_meta) {
-               /* ioctls valid for video, vbi, touch and metadata */
+       if (is_vid || is_vbi || is_meta) {
+               /* ioctls valid for video, vbi and metadata */
                if (ops->vidioc_s_std)
                        set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
                SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std);
-- 
2.20.1

Reply via email to