From 8919ab5395a00a076a7dc3141012a526ea19a431 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Fri, 10 Mar 2023 10:09:42 +0800 Subject: [PATCH] media: rockchip: vicap fixes bug of wake up mode Signed-off-by: Zefa Chen Change-Id: Ie51db5cb7944ce0f979344f4e00f0d75816642e9 --- drivers/media/platform/rockchip/cif/capture.c | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 80ba991cbbec..ed74e5289179 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -8830,6 +8830,7 @@ static void rkcif_modify_line_int(struct rkcif_stream *stream, bool en) } rkcif_write_register_or(cif_dev, CIF_REG_MIPI_LVDS_INTEN, line_intr_en); + stream->is_line_inten = true; } else { rkcif_write_register_and(cif_dev, CIF_REG_MIPI_LVDS_INTEN, ~line_intr_en); @@ -8840,6 +8841,9 @@ static void rkcif_detect_wake_up_mode_change(struct rkcif_stream *stream) { struct rkcif_device *cif_dev = stream->cifdev; struct sditf_priv *priv = cif_dev->sditf[0]; + bool is_change = false; + int ch = 0; + int i = 0; if (!priv || priv->mode.rdbk_mode == RKISP_VICAP_ONLINE) return; @@ -8857,28 +8861,38 @@ static void rkcif_detect_wake_up_mode_change(struct rkcif_stream *stream) } if (cif_dev->wait_line && (!stream->is_line_wake_up)) { + is_change = true; stream->is_line_wake_up = true; if (stream->frame_phase == CIF_CSI_FRAME0_READY) stream->line_int_cnt = 1; else if (stream->frame_phase == CIF_CSI_FRAME1_READY) stream->line_int_cnt = 0; - rkcif_modify_line_int(stream, true); if (cif_dev->hdr.hdr_mode == HDR_X2) { cif_dev->stream[0].is_line_wake_up = true; - cif_dev->stream[0].is_line_inten = true; cif_dev->stream[0].line_int_cnt = stream->line_int_cnt; } else if (cif_dev->hdr.hdr_mode == HDR_X3) { cif_dev->stream[0].is_line_wake_up = true; cif_dev->stream[1].is_line_wake_up = true; - cif_dev->stream[0].is_line_inten = true; - cif_dev->stream[1].is_line_inten = true; cif_dev->stream[0].line_int_cnt = stream->line_int_cnt; cif_dev->stream[1].line_int_cnt = stream->line_int_cnt; } - stream->is_line_inten = true; } else if ((cif_dev->wait_line == 0) && stream->is_line_wake_up) { stream->is_line_wake_up = false; } + if (stream->is_line_wake_up) { + if (is_change) { + if (cif_dev->hdr.hdr_mode == HDR_X2) + ch = 2; + else if (cif_dev->hdr.hdr_mode == HDR_X3) + ch = 3; + else + ch = 1; + for (i = 0; i < ch; i++) + rkcif_modify_line_int(&cif_dev->stream[i], true); + } else { + rkcif_modify_line_int(stream, true); + } + } } u32 rkcif_mbus_pixelcode_to_v4l2(u32 pixelcode)