diff --git a/driver/vidc/inc/msm_vdec.h b/driver/vidc/inc/msm_vdec.h index dc538907a4..38983b09b9 100644 --- a/driver/vidc/inc/msm_vdec.h +++ b/driver/vidc/inc/msm_vdec.h @@ -23,6 +23,8 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst, struct v4l2_streamparm *s_parm); int msm_vdec_g_param(struct msm_vidc_inst *inst, struct v4l2_streamparm *s_parm); +int msm_vdec_subscribe_event(struct msm_vidc_inst *inst, + const struct v4l2_event_subscription *sub); int msm_vdec_enum_fmt(struct msm_vidc_inst *inst, struct v4l2_fmtdesc *f); int msm_vdec_inst_init(struct msm_vidc_inst *inst); int msm_vdec_inst_deinit(struct msm_vidc_inst *inst); diff --git a/driver/vidc/inc/msm_venc.h b/driver/vidc/inc/msm_venc.h index f259ff7a7b..b1519f6a82 100644 --- a/driver/vidc/inc/msm_venc.h +++ b/driver/vidc/inc/msm_venc.h @@ -25,6 +25,8 @@ int msm_venc_s_param(struct msm_vidc_inst *inst, struct v4l2_streamparm *s_parm); int msm_venc_g_param(struct msm_vidc_inst *inst, struct v4l2_streamparm *s_parm); +int msm_venc_subscribe_event(struct msm_vidc_inst *inst, + const struct v4l2_event_subscription *sub); int msm_venc_enum_fmt(struct msm_vidc_inst *inst, struct v4l2_fmtdesc *f); int msm_venc_inst_init(struct msm_vidc_inst *inst); int msm_venc_inst_deinit(struct msm_vidc_inst *inst); diff --git a/driver/vidc/inc/msm_vidc_core.h b/driver/vidc/inc/msm_vidc_core.h index 27862c4e6d..0dda3f27cb 100644 --- a/driver/vidc/inc/msm_vidc_core.h +++ b/driver/vidc/inc/msm_vidc_core.h @@ -12,6 +12,8 @@ struct msm_vidc_core; +#define MAX_EVENTS 30 + #define call_venus_op(d, op, ...) \ (((d) && (d)->venus_ops && (d)->venus_ops->op) ? \ ((d)->venus_ops->op(__VA_ARGS__)):0) diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 3a91ab17bb..b3f4f7e419 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -2827,6 +2827,37 @@ int msm_vdec_g_param(struct msm_vidc_inst *inst, return 0; } +int msm_vdec_subscribe_event(struct msm_vidc_inst *inst, + const struct v4l2_event_subscription *sub) +{ + int rc = 0; + + if (!inst || !sub) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + switch (sub->type) { + case V4L2_EVENT_EOS: + rc = v4l2_event_subscribe(&inst->event_handler, sub, MAX_EVENTS, NULL); + break; + case V4L2_EVENT_SOURCE_CHANGE: + rc = v4l2_src_change_event_subscribe(&inst->event_handler, sub); + break; + case V4L2_EVENT_CTRL: + rc = v4l2_ctrl_subscribe_event(&inst->event_handler, sub); + break; + default: + i_vpr_e(inst, "%s: invalid type %d id %d\n", __func__, sub->type, sub->id); + return -EINVAL; + } + + if (rc) + i_vpr_e(inst, "%s: failed, type %d id %d\n", + __func__, sub->type, sub->id); + return rc; +} + static int msm_vdec_check_colorformat_supported(struct msm_vidc_inst* inst, enum msm_vidc_colorformat_type colorformat) { diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index 4751ca96ba..895da9d860 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -1707,6 +1707,34 @@ int msm_venc_g_param(struct msm_vidc_inst *inst, return 0; } +int msm_venc_subscribe_event(struct msm_vidc_inst *inst, + const struct v4l2_event_subscription *sub) +{ + int rc = 0; + + if (!inst || !sub) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + switch (sub->type) { + case V4L2_EVENT_EOS: + rc = v4l2_event_subscribe(&inst->event_handler, sub, MAX_EVENTS, NULL); + break; + case V4L2_EVENT_CTRL: + rc = v4l2_ctrl_subscribe_event(&inst->event_handler, sub); + break; + default: + i_vpr_e(inst, "%s: invalid type %d id %d\n", __func__, sub->type, sub->id); + return -EINVAL; + } + + if (rc) + i_vpr_e(inst, "%s: failed, type %d id %d\n", + __func__, sub->type, sub->id); + return rc; +} + int msm_venc_enum_fmt(struct msm_vidc_inst *inst, struct v4l2_fmtdesc *f) { int rc = 0; diff --git a/driver/vidc/src/msm_vidc.c b/driver/vidc/src/msm_vidc.c index 6c4d7a2a7e..6c80d5963a 100644 --- a/driver/vidc/src/msm_vidc.c +++ b/driver/vidc/src/msm_vidc.c @@ -26,8 +26,6 @@ /* kernel/msm-4.19 */ #define MSM_VIDC_VERSION ((5 << 16) + (10 << 8) + 0) -#define MAX_EVENTS 30 - static inline bool valid_v4l2_buffer(struct v4l2_buffer *b, struct msm_vidc_inst *inst) { @@ -742,12 +740,14 @@ int msm_vidc_subscribe_event(void *instance, d_vpr_e("%s: invalid params\n", __func__); return -EINVAL; } + i_vpr_h(inst, "%s: type %d id %d\n", __func__, sub->type, sub->id); - rc = v4l2_event_subscribe(&inst->event_handler, - sub, MAX_EVENTS, NULL); - if (rc) - i_vpr_e(inst, "%s: fialed, type %d id %d\n", - __func__, sub->type, sub->id); + + if (inst->domain == MSM_VIDC_DECODER) + rc = msm_vdec_subscribe_event(inst, sub); + if (inst->domain == MSM_VIDC_ENCODER) + rc = msm_venc_subscribe_event(inst, sub); + return rc; } EXPORT_SYMBOL(msm_vidc_subscribe_event); @@ -765,7 +765,7 @@ int msm_vidc_unsubscribe_event(void *instance, i_vpr_h(inst, "%s: type %d id %d\n", __func__, sub->type, sub->id); rc = v4l2_event_unsubscribe(&inst->event_handler, sub); if (rc) - i_vpr_e(inst, "%s: fialed, type %d id %d\n", + i_vpr_e(inst, "%s: failed, type %d id %d\n", __func__, sub->type, sub->id); return rc; }