From: Ricardo Ribalda <ribalda@chromium.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Hans de Goede <hdegoede@redhat.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Hans Verkuil <hverkuil@xs4all.nl>
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
Ricardo Ribalda <ribalda@chromium.org>,
Hans Verkuil <hans@jjverkuil.nl>
Subject: [PATCH 7/9] media: uvcvideo: uvc_v4l2_unlocked_ioctl: Invert PM logic
Date: Wed, 28 May 2025 17:58:02 +0000 [thread overview]
Message-ID: <20250528-uvc-grannular-invert-v1-7-d01581f9cc25@chromium.org> (raw)
In-Reply-To: <20250528-uvc-grannular-invert-v1-0-d01581f9cc25@chromium.org>
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 --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,
--
2.49.0.1266.g31b7d2e469-goog
next prev parent reply other threads:[~2025-05-28 17:58 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-28 17:57 [PATCH 0/9] media: uvcvideo: Invert granular PM logic + PM fix Ricardo Ribalda
2025-05-28 17:57 ` [PATCH 1/9] media: uvcvideo: Refactor uvc_queue_streamon Ricardo Ribalda
2025-05-28 17:57 ` [PATCH 2/9] media: uvcvideo: Refactor uvc_v4l2_compat_ioctl32 Ricardo Ribalda
2025-05-28 17:57 ` [PATCH 3/9] media: uvcvideo: Use vb2 ioctl and fop helpers Ricardo Ribalda
2025-05-28 17:57 ` [PATCH 4/9] media: uvcvideo: Remove stream->is_streaming field Ricardo Ribalda
2025-05-28 17:58 ` [PATCH 5/9] media: uvcvideo: Turn on the camera if V4L2_EVENT_SUB_FL_SEND_INITIAL Ricardo Ribalda
2025-06-02 8:58 ` Hans de Goede
2025-05-28 17:58 ` [PATCH 6/9] media: uvcvideo: Do not enable camera during UVCIOC_CTRL_MAP32 Ricardo Ribalda
2025-06-02 9:46 ` Hans de Goede
2025-05-28 17:58 ` Ricardo Ribalda [this message]
2025-06-02 9:58 ` [PATCH 7/9] media: uvcvideo: uvc_v4l2_unlocked_ioctl: Invert PM logic Hans de Goede
2025-05-28 17:58 ` [PATCH 8/9] media: uvcvideo: Do not turn on the camera unless is needed Ricardo Ribalda
2025-05-28 17:58 ` [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls Ricardo Ribalda
2025-06-02 10:10 ` Hans de Goede
2025-06-02 10:27 ` Ricardo Ribalda
2025-06-02 11:07 ` Hans de Goede
2025-06-02 11:11 ` Ricardo Ribalda
2025-06-02 11:24 ` Hans de Goede
2025-06-02 11:40 ` Ricardo Ribalda
2025-06-02 11:43 ` Hans de Goede
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250528-uvc-grannular-invert-v1-7-d01581f9cc25@chromium.org \
--to=ribalda@chromium.org \
--cc=hans@jjverkuil.nl \
--cc=hdegoede@redhat.com \
--cc=hverkuil@xs4all.nl \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).