ANDROID: media: v4l2-core: extend the v4l2 subdev ioctl to support request
This patch is based on 1699785. It uses to extend the related interface to support the request-based operations. We use extension fields in the parameters of VIDIOC_SUBDEV_S_SELECTION, VIDIOC_SUBDEV_S_FMT and VIDIOC_SUBDEV_S_FRAME_INTERVAL as request fd. The driver uses media_request_get_by_fd() to retrieve the media request and save the pending change in it, so that we can apply the pending change in req_queue() callback then. Bug: 191903073 CR-Id: Signed-off-by: Louis Kuo <louis.kuo@mediatek.com> Change-Id: Idb7921724cf8febc44b01880a4ad8b7c9272ba6a
This commit is contained in:
@@ -316,6 +316,9 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_media_device_setup_link);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_reserved_fmt_fields);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_fill_ext_fmtdesc);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_mask_adjust);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_selection);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_fmt);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_v4l2subdev_set_frame_interval);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_scmi_timeout_sync);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_new_ilb);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_force_compatible_pre);
|
||||
|
@@ -22,6 +22,9 @@
|
||||
#include <media/v4l2-ioctl.h>
|
||||
#include <media/v4l2-fh.h>
|
||||
#include <media/v4l2-event.h>
|
||||
#ifndef __GENKSYMS__
|
||||
#include <trace/hooks/v4l2core.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
static int subdev_fh_init(struct v4l2_subdev_fh *fh, struct v4l2_subdev *sd)
|
||||
@@ -511,10 +514,16 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
|
||||
case VIDIOC_SUBDEV_S_FMT: {
|
||||
struct v4l2_subdev_format *format = arg;
|
||||
int ret = 0;
|
||||
|
||||
if (format->which != V4L2_SUBDEV_FORMAT_TRY && ro_subdev)
|
||||
return -EPERM;
|
||||
|
||||
trace_android_vh_v4l2subdev_set_fmt(sd, subdev_fh->pad,
|
||||
format, &ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memset(format->reserved, 0, sizeof(format->reserved));
|
||||
memset(format->format.reserved, 0, sizeof(format->format.reserved));
|
||||
return v4l2_subdev_call(sd, pad, set_fmt, subdev_fh->pad, format);
|
||||
@@ -585,10 +594,15 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
|
||||
case VIDIOC_SUBDEV_S_FRAME_INTERVAL: {
|
||||
struct v4l2_subdev_frame_interval *fi = arg;
|
||||
int ret = 0;
|
||||
|
||||
if (ro_subdev)
|
||||
return -EPERM;
|
||||
|
||||
trace_android_vh_v4l2subdev_set_frame_interval(sd, fi, &ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memset(fi->reserved, 0, sizeof(fi->reserved));
|
||||
return v4l2_subdev_call(sd, video, s_frame_interval, arg);
|
||||
}
|
||||
@@ -611,10 +625,16 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
|
||||
case VIDIOC_SUBDEV_S_SELECTION: {
|
||||
struct v4l2_subdev_selection *sel = arg;
|
||||
int ret = 0;
|
||||
|
||||
if (sel->which != V4L2_SUBDEV_FORMAT_TRY && ro_subdev)
|
||||
return -EPERM;
|
||||
|
||||
trace_android_vh_v4l2subdev_set_selection(sd, subdev_fh->pad,
|
||||
sel, &ret);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
memset(sel->reserved, 0, sizeof(sel->reserved));
|
||||
return v4l2_subdev_call(
|
||||
sd, pad, set_selection, subdev_fh->pad, sel);
|
||||
|
@@ -24,6 +24,26 @@ DECLARE_HOOK(android_vh_clear_mask_adjust,
|
||||
TP_PROTO(unsigned int ctrl, int *n),
|
||||
TP_ARGS(ctrl, n));
|
||||
|
||||
struct v4l2_subdev;
|
||||
struct v4l2_subdev_pad_config;
|
||||
struct v4l2_subdev_selection;
|
||||
DECLARE_HOOK(android_vh_v4l2subdev_set_selection,
|
||||
TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *pad,
|
||||
struct v4l2_subdev_selection *sel, int *ret),
|
||||
TP_ARGS(sd, pad, sel, ret));
|
||||
|
||||
struct v4l2_subdev_format;
|
||||
DECLARE_HOOK(android_vh_v4l2subdev_set_fmt,
|
||||
TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *pad,
|
||||
struct v4l2_subdev_format *format, int *ret),
|
||||
TP_ARGS(sd, pad, format, ret));
|
||||
|
||||
struct v4l2_subdev_frame_interval;
|
||||
DECLARE_HOOK(android_vh_v4l2subdev_set_frame_interval,
|
||||
TP_PROTO(struct v4l2_subdev *sd, struct v4l2_subdev_frame_interval *fi,
|
||||
int *ret),
|
||||
TP_ARGS(sd, fi, ret));
|
||||
|
||||
#endif /* _TRACE_HOOK_V4L2CORE_H */
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
||||
|
Reference in New Issue
Block a user