diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 416938977b4e..7b17248f3431 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -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); diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index a7d508e74d6b..da491fd1baf8 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -22,6 +22,9 @@ #include #include #include +#ifndef __GENKSYMS__ +#include +#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); diff --git a/include/trace/hooks/v4l2core.h b/include/trace/hooks/v4l2core.h index 26b49d69f13d..32b6e96ba627 100644 --- a/include/trace/hooks/v4l2core.h +++ b/include/trace/hooks/v4l2core.h @@ -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