From 7ccae419d38bdb647e6dd03b1f1b2b9a781c726e Mon Sep 17 00:00:00 2001 From: Depeng Shao Date: Tue, 28 Jul 2020 15:33:46 +0800 Subject: [PATCH] msm: camera: isp: Update ife substate before apply setting Offline mode may receive the SOF and REG_UPD irq event earlier than CMD processing return back, then the event will be dropped. This change updates ife substate to APPLIED state before apply setting and move the req to wait list. CRs-Fixed: 2736862 Change-Id: I052c618ef64aae0e30232609a209a0dc43b53f8c Signed-off-by: Depeng Shao --- drivers/cam_isp/cam_isp_context.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/drivers/cam_isp/cam_isp_context.c b/drivers/cam_isp/cam_isp_context.c index be3b123bd6a7..794c88a16c1d 100644 --- a/drivers/cam_isp/cam_isp_context.c +++ b/drivers/cam_isp/cam_isp_context.c @@ -1067,6 +1067,7 @@ static int __cam_isp_ctx_apply_req_offline( void *priv, void *data) { int rc = 0; + int64_t prev_applied_req; struct cam_context *ctx = NULL; struct cam_isp_context *ctx_isp = priv; struct cam_ctx_request *req; @@ -1112,22 +1113,36 @@ static int __cam_isp_ctx_apply_req_offline( cfg.priv = &req_isp->hw_update_data; cfg.init_packet = 0; + /* + * Offline mode may receive the SOF and REG_UPD earlier than + * CDM processing return back, so we set the substate before + * apply setting. + */ + spin_lock_bh(&ctx->lock); + + atomic_set(&ctx_isp->rxd_epoch, 0); + ctx_isp->substate_activated = CAM_ISP_CTX_ACTIVATED_APPLIED; + prev_applied_req = ctx_isp->last_applied_req_id; + ctx_isp->last_applied_req_id = req->request_id; + + list_del_init(&req->list); + list_add_tail(&req->list, &ctx->wait_req_list); + + spin_unlock_bh(&ctx->lock); + rc = ctx->hw_mgr_intf->hw_config(ctx->hw_mgr_intf->hw_mgr_priv, &cfg); if (rc) { CAM_ERR_RATE_LIMIT(CAM_ISP, "Can not apply the configuration"); - } else { spin_lock_bh(&ctx->lock); - atomic_set(&ctx_isp->rxd_epoch, 0); - - ctx_isp->substate_activated = CAM_ISP_CTX_ACTIVATED_APPLIED; - ctx_isp->last_applied_req_id = req->request_id; + ctx_isp->substate_activated = CAM_ISP_CTX_ACTIVATED_SOF; + ctx_isp->last_applied_req_id = prev_applied_req; list_del_init(&req->list); - list_add_tail(&req->list, &ctx->wait_req_list); + list_add(&req->list, &ctx->pending_req_list); spin_unlock_bh(&ctx->lock); - + } else { CAM_DBG(CAM_ISP, "New substate state %d, applied req %lld", CAM_ISP_CTX_ACTIVATED_APPLIED, ctx_isp->last_applied_req_id); @@ -1136,6 +1151,7 @@ static int __cam_isp_ctx_apply_req_offline( CAM_ISP_STATE_CHANGE_TRIGGER_APPLIED, req->request_id); } + end: return rc; }