From a2b5f8e265b3271968081d4261a11d4e6ece694d Mon Sep 17 00:00:00 2001 From: Allon Huang Date: Fri, 23 Oct 2020 11:51:09 +0800 Subject: [PATCH] media: rockchip: cif: fix panic when frm1/frm0 end interrupt occur simultaneously panic when frm1/frm0 end triggered simultaneously and only one buf in queue Signed-off-by: Allon Huang Change-Id: I4fb43e3ed0ed728db21d2b7b7fc92c5d8aa04aaa --- drivers/media/platform/rockchip/cif/capture.c | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 3a6fc19387a8..6707a9b4e1b4 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -1027,9 +1027,7 @@ static void rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream, struct rkcif_buffer, queue); list_del(&stream->curr_buf->queue); buffer = stream->curr_buf; - } - - if (stream->frame_phase == CIF_CSI_FRAME1_READY) { + } else if (stream->frame_phase == CIF_CSI_FRAME1_READY) { stream->next_buf = list_first_entry(&stream->buf_head, struct rkcif_buffer, queue); list_del(&stream->next_buf->queue); @@ -1046,9 +1044,7 @@ static void rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream, if (stream->frame_phase == CIF_CSI_FRAME0_READY) { frm_addr_y = CIF_REG_DVP_FRM0_ADDR_Y; frm_addr_uv = CIF_REG_DVP_FRM0_ADDR_UV; - } - - if (stream->frame_phase == CIF_CSI_FRAME1_READY) { + } else if (stream->frame_phase == CIF_CSI_FRAME1_READY) { frm_addr_y = CIF_REG_DVP_FRM1_ADDR_Y; frm_addr_uv = CIF_REG_DVP_FRM1_ADDR_UV; } @@ -1141,17 +1137,17 @@ static void rkcif_assign_new_buffer_pingpong(struct rkcif_stream *stream, } else { if (mbus_cfg->type == V4L2_MBUS_CSI2 || mbus_cfg->type == V4L2_MBUS_CCP2) { - frm_addr_y = stream->frame_phase & CIF_CSI_FRAME1_READY ? - get_reg_index_of_frm1_y_addr(csi_ch) : - get_reg_index_of_frm0_y_addr(csi_ch); - frm_addr_uv = stream->frame_phase & CIF_CSI_FRAME1_READY ? - get_reg_index_of_frm1_uv_addr(csi_ch) : - get_reg_index_of_frm0_uv_addr(csi_ch); + frm_addr_y = stream->frame_phase & CIF_CSI_FRAME0_READY ? + get_reg_index_of_frm0_y_addr(csi_ch) : + get_reg_index_of_frm1_y_addr(csi_ch); + frm_addr_uv = stream->frame_phase & CIF_CSI_FRAME0_READY ? + get_reg_index_of_frm0_uv_addr(csi_ch) : + get_reg_index_of_frm1_uv_addr(csi_ch); } else { - frm_addr_y = stream->frame_phase & CIF_CSI_FRAME1_READY ? - CIF_FRM1_ADDR_Y : CIF_FRM0_ADDR_Y; - frm_addr_uv = stream->frame_phase & CIF_CSI_FRAME1_READY ? - CIF_FRM1_ADDR_UV : CIF_FRM0_ADDR_UV; + frm_addr_y = stream->frame_phase & CIF_CSI_FRAME0_READY ? + CIF_FRM0_ADDR_Y : CIF_FRM1_ADDR_Y; + frm_addr_uv = stream->frame_phase & CIF_CSI_FRAME0_READY ? + CIF_FRM0_ADDR_UV : CIF_FRM1_ADDR_UV; } spin_lock(&stream->vbq_lock); @@ -1161,9 +1157,7 @@ static void rkcif_assign_new_buffer_pingpong(struct rkcif_stream *stream, struct rkcif_buffer, queue); list_del(&stream->curr_buf->queue); buffer = stream->curr_buf; - } - - if (stream->frame_phase == CIF_CSI_FRAME1_READY) { + } else if (stream->frame_phase == CIF_CSI_FRAME1_READY) { stream->next_buf = list_first_entry(&stream->buf_head, struct rkcif_buffer, queue); list_del(&stream->next_buf->queue);