diff mbox series

[7/9] media: uvcvideo: uvc_v4l2_unlocked_ioctl: Invert PM logic

Message ID 20250528-uvc-grannular-invert-v1-7-d01581f9cc25@chromium.org
State New
Headers show
Series media: uvcvideo: Invert granular PM logic + PM fix | expand

Commit Message

Ricardo Ribalda May 28, 2025, 5:58 p.m. UTC
Instead of listing the IOCTLs that do not need to turn on the camera,
list the IOCTLs that need to turn it on. This makes the code more
maintainable.

This patch is designed to be a NOP. Non relevant IOCTLs will be removed
in future patches.

Suggested-by: Hans Verkuil <hans@jjverkuil.nl>
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
---
 drivers/media/usb/uvc/uvc_v4l2.c | 117 +++++++++++++++++++++++++++++++--------
 1 file changed, 93 insertions(+), 24 deletions(-)
diff mbox series

Patch

diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
index 2c6f3cf6bcc3f116bbdb3383d9af7d5be9832537..e7373a2ae3c37ca02f9076773154901a603820ac 100644
--- a/drivers/media/usb/uvc/uvc_v4l2.c
+++ b/drivers/media/usb/uvc/uvc_v4l2.c
@@ -1264,42 +1264,111 @@  static long uvc_v4l2_compat_ioctl32(struct file *file,
 }
 #endif
 
-static long uvc_v4l2_unlocked_ioctl(struct file *file,
-				    unsigned int cmd, unsigned long arg)
+static long uvc_v4l2_pm_ioctl(struct file *file,
+			      unsigned int cmd, unsigned long arg)
 {
 	struct uvc_fh *handle = file->private_data;
 	int ret;
 
-	/* The following IOCTLs do not need to turn on the camera. */
-	switch (cmd) {
-	case VIDIOC_CREATE_BUFS:
-	case VIDIOC_DQBUF:
-	case VIDIOC_ENUM_FMT:
-	case VIDIOC_ENUM_FRAMEINTERVALS:
-	case VIDIOC_ENUM_FRAMESIZES:
-	case VIDIOC_ENUMINPUT:
-	case VIDIOC_EXPBUF:
-	case VIDIOC_G_FMT:
-	case VIDIOC_G_PARM:
-	case VIDIOC_G_SELECTION:
-	case VIDIOC_QBUF:
-	case VIDIOC_QUERYCAP:
-	case VIDIOC_REQBUFS:
-	case VIDIOC_SUBSCRIBE_EVENT:
-	case VIDIOC_UNSUBSCRIBE_EVENT:
-		return video_ioctl2(file, cmd, arg);
-	}
-
 	ret = uvc_pm_get(handle->stream->dev);
 	if (ret)
 		return ret;
-
 	ret = video_ioctl2(file, cmd, arg);
-
 	uvc_pm_put(handle->stream->dev);
+
 	return ret;
 }
 
+static long uvc_v4l2_unlocked_ioctl(struct file *file,
+				    unsigned int cmd, unsigned long arg)
+{
+	/*
+	 * For now, we do not support granular power saving for compat
+	 * syscalls.
+	 */
+	if (in_compat_syscall())
+		return uvc_v4l2_pm_ioctl(file, cmd, arg);
+
+	/* The following IOCTLs do need to turn on the camera. */
+	switch (cmd) {
+	case UVCIOC_CTRL_MAP:
+	case UVCIOC_CTRL_QUERY:
+	case VIDIOC_CROPCAP:
+	case VIDIOC_DBG_G_CHIP_INFO:
+	case VIDIOC_DBG_G_REGISTER:
+	case VIDIOC_DBG_S_REGISTER:
+	case VIDIOC_DECODER_CMD:
+	case VIDIOC_DQEVENT:
+	case VIDIOC_DV_TIMINGS_CAP:
+	case VIDIOC_ENCODER_CMD:
+	case VIDIOC_ENUMAUDIO:
+	case VIDIOC_ENUMAUDOUT:
+	case VIDIOC_ENUMOUTPUT:
+	case VIDIOC_ENUMSTD:
+	case VIDIOC_ENUM_DV_TIMINGS:
+	case VIDIOC_ENUM_FREQ_BANDS:
+	case VIDIOC_G_AUDIO:
+	case VIDIOC_G_AUDOUT:
+	case VIDIOC_G_CROP:
+	case VIDIOC_G_CTRL:
+	case VIDIOC_G_DV_TIMINGS:
+	case VIDIOC_G_EDID:
+	case VIDIOC_G_ENC_INDEX:
+	case VIDIOC_G_EXT_CTRLS:
+	case VIDIOC_G_FBUF:
+	case VIDIOC_G_FREQUENCY:
+	case VIDIOC_G_INPUT:
+	case VIDIOC_G_JPEGCOMP:
+	case VIDIOC_G_MODULATOR:
+	case VIDIOC_G_OUTPUT:
+	case VIDIOC_G_PRIORITY:
+	case VIDIOC_G_SLICED_VBI_CAP:
+	case VIDIOC_G_STD:
+	case VIDIOC_G_TUNER:
+	case VIDIOC_LOG_STATUS:
+	case VIDIOC_OVERLAY:
+	case VIDIOC_PREPARE_BUF:
+	case VIDIOC_QUERYBUF:
+	case VIDIOC_QUERYCAP:
+	case VIDIOC_QUERYCTRL:
+	case VIDIOC_QUERYMENU:
+	case VIDIOC_QUERYSTD:
+	case VIDIOC_QUERY_DV_TIMINGS:
+	case VIDIOC_QUERY_EXT_CTRL:
+	case VIDIOC_REMOVE_BUFS:
+	case VIDIOC_STREAMOFF:
+	case VIDIOC_STREAMON:
+	case VIDIOC_S_AUDIO:
+	case VIDIOC_S_AUDOUT:
+	case VIDIOC_S_CROP:
+	case VIDIOC_S_CTRL:
+	case VIDIOC_S_DV_TIMINGS:
+	case VIDIOC_S_EDID:
+	case VIDIOC_S_EXT_CTRLS:
+	case VIDIOC_S_FBUF:
+	case VIDIOC_S_FMT:
+	case VIDIOC_S_FREQUENCY:
+	case VIDIOC_S_HW_FREQ_SEEK:
+	case VIDIOC_S_INPUT:
+	case VIDIOC_S_JPEGCOMP:
+	case VIDIOC_S_MODULATOR:
+	case VIDIOC_S_OUTPUT:
+	case VIDIOC_S_PARM:
+	case VIDIOC_S_PRIORITY:
+	case VIDIOC_S_SELECTION:
+	case VIDIOC_S_STD:
+	case VIDIOC_S_TUNER:
+	case VIDIOC_TRY_DECODER_CMD:
+	case VIDIOC_TRY_ENCODER_CMD:
+	case VIDIOC_TRY_EXT_CTRLS:
+	case VIDIOC_TRY_FMT:
+		return uvc_v4l2_pm_ioctl(file, cmd, arg);
+	}
+
+	/* The other IOCTLs can run with the camera off. */
+	return video_ioctl2(file, cmd, arg);
+}
+
 const struct v4l2_ioctl_ops uvc_ioctl_ops = {
 	.vidioc_g_fmt_vid_cap = uvc_ioctl_g_fmt,
 	.vidioc_g_fmt_vid_out = uvc_ioctl_g_fmt,