@@ -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,
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(-)