diff --git a/drivers/cam_isp/cam_isp_context.c b/drivers/cam_isp/cam_isp_context.c index 2f6e9b7a97c4..38f5489d9aa4 100644 --- a/drivers/cam_isp/cam_isp_context.c +++ b/drivers/cam_isp/cam_isp_context.c @@ -3069,6 +3069,17 @@ static int __cam_isp_ctx_apply_req_in_activated_state( struct cam_isp_context *ctx_isp = NULL; struct cam_hw_config_args cfg = {0}; + ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; + + if (apply->re_apply) + if (apply->request_id <= ctx_isp->last_applied_req_id) { + CAM_INFO_RATE_LIMIT(CAM_ISP, + "ctx_id:%d Trying to reapply the same request %llu again", + ctx->ctx_id, + apply->request_id); + return 0; + } + if (list_empty(&ctx->pending_req_list)) { CAM_ERR_RATE_LIMIT(CAM_ISP, "ctx_id:%d No available request for Apply id %lld", @@ -3084,8 +3095,6 @@ static int __cam_isp_ctx_apply_req_in_activated_state( * The maximum number of request allowed to be outstanding is 2. * */ - ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; - if (atomic_read(&ctx_isp->process_bubble)) { CAM_INFO_RATE_LIMIT(CAM_ISP, "ctx_id:%d Processing bubble cannot apply Request Id %llu", @@ -3095,15 +3104,6 @@ static int __cam_isp_ctx_apply_req_in_activated_state( goto end; } - if (apply->re_apply) - if (apply->request_id <= ctx_isp->last_applied_req_id) { - CAM_INFO_RATE_LIMIT(CAM_ISP, - "ctx_id:%d Trying to reapply the same request %llu again", - ctx->ctx_id, - apply->request_id); - return 0; - } - spin_lock_bh(&ctx->lock); req = list_first_entry(&ctx->pending_req_list, struct cam_ctx_request, list); diff --git a/drivers/cam_req_mgr/cam_req_mgr_core.c b/drivers/cam_req_mgr/cam_req_mgr_core.c index 5439c344e069..d4516ad63884 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_core.c +++ b/drivers/cam_req_mgr/cam_req_mgr_core.c @@ -929,6 +929,19 @@ static int __cam_req_mgr_send_req(struct cam_req_mgr_core_link *link, apply_req.report_if_bubble = in_q->slot[idx].recover; + /* + * If it is dual trigger usecase, need to tell + * devices that the req is re-applied, then the + * devices need to skip applying if the req has + * been handled. + * e.x. ISP device + */ + if (link->retry_cnt > 0) { + if (!apply_req.report_if_bubble && + link->dual_trigger) + apply_req.re_apply = true; + } + if ((slot->ops.dev_hdl == dev->dev_hdl) && (slot->ops.is_applied)) { slot->ops.is_applied = false;