Fix issue "During video recording, still picture captured shows full green screen."

Root cause:
N/A

How to fix:
N/A

Issue:PRJ8901-1488

Change-Id: I482ca772e5bad60e47b06dfb625db1417eba593f
(cherry picked from commit 75bcf6833da5769814e7dfe9547f628cc33fca68)
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c
index 7a0a069..ba4d4f0 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c
@@ -757,6 +757,65 @@
 	return 0;
 }
 
+
+static int msm_isp_buf_err(struct msm_isp_buf_mgr *buf_mgr,
+   uint32_t bufq_handle, uint32_t buf_index,
+   struct timeval *tv, uint32_t frame_id, uint32_t output_format)
+{
+   int rc = 0;
+   unsigned long flags;
+   struct msm_isp_bufq *bufq = NULL;
+   struct msm_isp_buffer *buf_info = NULL;
+   enum msm_isp_buffer_state state;
+
+   bufq = msm_isp_get_bufq(buf_mgr, bufq_handle);
+   if (!bufq) {
+       pr_err("Invalid bufq\n");
+       return -EINVAL;
+   }
+
+   buf_info = msm_isp_get_buf_ptr(buf_mgr, bufq_handle, buf_index);
+   if (!buf_info) {
+       pr_err("%s: buf not found\n", __func__);
+       return -EINVAL;
+   }
+
+   spin_lock_irqsave(&bufq->bufq_lock, flags);
+   state = buf_info->state;
+
+   if (BUF_SRC(bufq->stream_id) == MSM_ISP_BUFFER_SRC_HAL) {
+       if (state == MSM_ISP_BUFFER_STATE_DEQUEUED) {
+           buf_info->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
+           spin_unlock_irqrestore(&bufq->bufq_lock, flags);
+           buf_mgr->vb2_ops->buf_error(buf_info->vb2_v4l2_buf,
+               bufq->session_id, bufq->stream_id,
+               frame_id, tv, output_format);
+       } else {
+           spin_unlock_irqrestore(&bufq->bufq_lock, flags);
+       }
+       goto done;
+   }
+
+   /*
+    * For native buffer put the diverted buffer back to queue since caller
+    * is not going to send it to CPP, this is error case like
+    * drop_frame/empty_buffer
+    */
+   if (state == MSM_ISP_BUFFER_STATE_DIVERTED) {
+       buf_info->state = MSM_ISP_BUFFER_STATE_PREPARED;
+       rc = msm_isp_put_buf_unsafe(buf_mgr, buf_info->bufq_handle,
+           buf_info->buf_idx);
+       if (rc < 0)
+           pr_err("%s: Buf put failed\n", __func__);
+   }
+   spin_unlock_irqrestore(&bufq->bufq_lock, flags);
+done:
+   return rc;
+}
+
+
+
+
 static int msm_isp_buf_done(struct msm_isp_buf_mgr *buf_mgr,
 	uint32_t bufq_handle, uint32_t buf_index,
 	struct timeval *tv, uint32_t frame_id, uint32_t output_format)
@@ -1505,6 +1564,7 @@
 	.buf_mgr_debug = msm_isp_buf_mgr_debug,
 	.get_bufq = msm_isp_get_bufq,
 	.buf_divert = msm_isp_buf_divert,
+	.buf_err = msm_isp_buf_err,
 };
 
 int msm_isp_create_isp_buf_mgr(
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h
index 4ea6dd6..fa20a95 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h
@@ -180,6 +180,9 @@
 	int (*buf_divert)(struct msm_isp_buf_mgr *buf_mgr,
 			uint32_t bufq_handle, uint32_t buf_index,
 			struct timeval *tv, uint32_t frame_id);
+	int (*buf_err)(struct msm_isp_buf_mgr *buf_mgr,
+       uint32_t bufq_handle, uint32_t buf_index,
+       struct timeval *tv, uint32_t frame_id, uint32_t output_format);
 };
 
 struct msm_isp_buf_mgr {
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
index 63ae9d1..54812dc 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c
@@ -3600,7 +3600,7 @@
 	buf->buf_debug.put_state[buf->buf_debug.put_state_last] =
 		MSM_ISP_BUFFER_STATE_DROP_REG;
 	buf->buf_debug.put_state_last ^= 1;
-	rc = vfe_dev->buf_mgr->ops->buf_done(vfe_dev->buf_mgr,
+	rc = vfe_dev->buf_mgr->ops->buf_err(vfe_dev->buf_mgr,
 		buf->bufq_handle, buf->buf_idx,
 		&timestamp.buf_time, frame_id,
 		stream_info->runtime_output_format);