diff --git a/drivers/cam_fd/cam_fd_dev.c b/drivers/cam_fd/cam_fd_dev.c index e34c9bcc1e0b..3797a1145846 100644 --- a/drivers/cam_fd/cam_fd_dev.c +++ b/drivers/cam_fd/cam_fd_dev.c @@ -62,7 +62,7 @@ static int cam_fd_dev_open(struct v4l2_subdev *sd, return 0; } -static int cam_fd_dev_close_internal(struct v4l2_subdev *sd, +int cam_fd_dev_close_internal(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) { struct cam_fd_dev *fd_dev = &g_fd_dev; diff --git a/drivers/cam_req_mgr/cam_req_mgr_core.c b/drivers/cam_req_mgr/cam_req_mgr_core.c index 9881516daf3d..5f6f3ae3e8b0 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_core.c +++ b/drivers/cam_req_mgr/cam_req_mgr_core.c @@ -759,6 +759,24 @@ static int __cam_req_mgr_check_next_req_slot( CAM_DBG(CAM_CRM, "idx: %d: slot->status %d", idx, slot->status); + /* + * Some slot can't be reset due to irq congestion and + * performance issue, we need to reset it when we + * want to move to this slot. + */ + if (slot->status == CRM_SLOT_STATUS_REQ_APPLIED) { + CAM_WARN(CAM_CRM, + "slot[%d] wasn't reset, reset it now", + idx); + if (in_q->last_applied_idx == idx) { + CAM_WARN(CAM_CRM, + "last_applied_idx: %d", + in_q->last_applied_idx); + in_q->last_applied_idx = -1; + } + __cam_req_mgr_reset_req_slot(link, idx); + } + /* Check if there is new req from CSL, if not complete req */ if (slot->status == CRM_SLOT_STATUS_NO_REQ) { rc = __cam_req_mgr_check_for_lower_pd_devices(link);