]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: iris: Add encoder support for V4L2 event subscription
authorDikshita Agarwal <quic_dikshita@quicinc.com>
Mon, 25 Aug 2025 07:00:42 +0000 (12:30 +0530)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Wed, 10 Sep 2025 07:02:37 +0000 (09:02 +0200)
Implement support for V4L2 event subscription on the encoder device by
handling the SUBSCRIBE_EVENT and UNSUBSCRIBE_EVENT ioctls with the
necessary hooks.

This enables userspace applications to subscribe to V4L2 events,
allowing asynchronous notification mechanisms.

Tested-by: Vikash Garodia <quic_vgarodia@quicinc.com> # X1E80100
Reviewed-by: Vikash Garodia <quic_vgarodia@quicinc.com>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-HDK
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # x1e80100-crd
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/qcom/iris/iris_venc.c
drivers/media/platform/qcom/iris/iris_venc.h
drivers/media/platform/qcom/iris/iris_vidc.c

index 55938050249fa1a041b835214e79028ae0b35e36..384b30555546f2a0677e49400f177b96611f866b 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
+#include <media/v4l2-event.h>
 #include <media/v4l2-mem2mem.h>
 
 #include "iris_buffer.h"
@@ -286,3 +287,16 @@ int iris_venc_validate_format(struct iris_inst *inst, u32 pixelformat)
 
        return 0;
 }
+
+int iris_venc_subscribe_event(struct iris_inst *inst,
+                             const struct v4l2_event_subscription *sub)
+{
+       switch (sub->type) {
+       case V4L2_EVENT_EOS:
+               return v4l2_event_subscribe(&inst->fh, sub, 0, NULL);
+       case V4L2_EVENT_CTRL:
+               return v4l2_ctrl_subscribe_event(&inst->fh, sub);
+       default:
+               return -EINVAL;
+       }
+}
index 04fd41275547c40c359c6ea04dfe4ee31d2d0df6..2d9614ae18e8a2318df6673fbeae5ee33c99b596 100644 (file)
@@ -14,5 +14,6 @@ int iris_venc_enum_fmt(struct iris_inst *inst, struct v4l2_fmtdesc *f);
 int iris_venc_try_fmt(struct iris_inst *inst, struct v4l2_format *f);
 int iris_venc_s_fmt(struct iris_inst *inst, struct v4l2_format *f);
 int iris_venc_validate_format(struct iris_inst *inst, u32 pixelformat);
+int iris_venc_subscribe_event(struct iris_inst *inst, const struct v4l2_event_subscription *sub);
 
 #endif
index 92a616787a30a51f4fbf4760badffd6fabc48cc6..5d9b36858e9317b1eddac12004432229e18967a7 100644 (file)
@@ -487,7 +487,12 @@ static int iris_subscribe_event(struct v4l2_fh *fh, const struct v4l2_event_subs
 {
        struct iris_inst *inst = container_of(fh, struct iris_inst, fh);
 
-       return iris_vdec_subscribe_event(inst, sub);
+       if (inst->domain == DECODER)
+               return iris_vdec_subscribe_event(inst, sub);
+       else if (inst->domain == ENCODER)
+               return iris_venc_subscribe_event(inst, sub);
+
+       return -EINVAL;
 }
 
 static int iris_dec_cmd(struct file *filp, void *fh,
@@ -582,6 +587,8 @@ static const struct v4l2_ioctl_ops iris_v4l2_ioctl_ops_enc = {
        .vidioc_enum_framesizes         = iris_enum_framesizes,
        .vidioc_enum_frameintervals     = iris_enum_frameintervals,
        .vidioc_querycap                = iris_querycap,
+       .vidioc_subscribe_event         = iris_subscribe_event,
+       .vidioc_unsubscribe_event       = v4l2_event_unsubscribe,
 };
 
 void iris_init_ops(struct iris_core *core)