summaryrefslogtreecommitdiff
path: root/drivers/media/platform/starfive/v4l2_driver/stf_video.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform/starfive/v4l2_driver/stf_video.c')
-rw-r--r--drivers/media/platform/starfive/v4l2_driver/stf_video.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/media/platform/starfive/v4l2_driver/stf_video.c b/drivers/media/platform/starfive/v4l2_driver/stf_video.c
index ac8f98a8cec9..8a5e5a846f96 100644
--- a/drivers/media/platform/starfive/v4l2_driver/stf_video.c
+++ b/drivers/media/platform/starfive/v4l2_driver/stf_video.c
@@ -340,8 +340,10 @@ static int video_buf_init(struct vb2_buffer *vb)
}
if (stf_vin_map_isp_pad(video->id, STF_ISP_PAD_SRC)
- == STF_ISP_PAD_SRC_SCD_Y)
+ == STF_ISP_PAD_SRC_SCD_Y) {
buffer->addr[1] = buffer->addr[0] + ISP_YHIST_BUFFER_SIZE;
+ buffer->vaddr_sc = vb2_plane_vaddr(vb, 0);
+ }
return 0;
}
@@ -1278,6 +1280,17 @@ int video_s_selection(struct file *file, void *fh,
return ret;
}
+static int stf_video_subscribe_event(struct v4l2_fh *fh,
+ const struct v4l2_event_subscription *sub)
+{
+ switch (sub->type) {
+ case V4L2_EVENT_FRAME_SYNC:
+ return v4l2_event_subscribe(fh, sub, 2, NULL);
+ default:
+ return v4l2_ctrl_subscribe_event(fh, sub);
+ }
+}
+
static const struct v4l2_ioctl_ops stf_vid_ioctl_ops = {
.vidioc_querycap = video_querycap,
.vidioc_enum_fmt_vid_cap = video_enum_fmt,
@@ -1302,6 +1315,8 @@ static const struct v4l2_ioctl_ops stf_vid_ioctl_ops = {
.vidioc_s_parm = video_s_parm,
.vidioc_s_selection = video_s_selection,
.vidioc_g_selection = video_g_selection,
+ .vidioc_subscribe_event = stf_video_subscribe_event,
+ .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
};
static const struct v4l2_ioctl_ops stf_vid_ioctl_ops_mp = {
@@ -1328,6 +1343,8 @@ static const struct v4l2_ioctl_ops stf_vid_ioctl_ops_mp = {
.vidioc_s_parm = video_s_parm,
.vidioc_s_selection = video_s_selection,
.vidioc_g_selection = video_g_selection,
+ .vidioc_subscribe_event = stf_video_subscribe_event,
+ .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
};
static const struct v4l2_ioctl_ops stf_vid_ioctl_ops_out = {
@@ -1347,6 +1364,8 @@ static const struct v4l2_ioctl_ops stf_vid_ioctl_ops_out = {
.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
.vidioc_streamon = vb2_ioctl_streamon,
.vidioc_streamoff = vb2_ioctl_streamoff,
+ .vidioc_subscribe_event = stf_video_subscribe_event,
+ .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
};
static int video_open(struct file *file)
@@ -1511,7 +1530,7 @@ int stf_video_register(struct stfcamss_video *video,
V4L2_CAP_VIDEO_CAPTURE;
vdev->vfl_dir = VFL_DIR_RX;
}
- vdev->device_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
+ vdev->device_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE | V4L2_CAP_IO_MC;
if (video->type == V4L2_CAP_VIDEO_OUTPUT)
vdev->ioctl_ops = &stf_vid_ioctl_ops_out;
else