From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 03:04:41 +0000 Subject: [PATCH] rk3568 rt init --- kernel/drivers/media/platform/rockchip/isp/rkisp.c | 49 +++++++++++++++++++++++++++++++++++-------------- 1 files changed, 35 insertions(+), 14 deletions(-) diff --git a/kernel/drivers/media/platform/rockchip/isp/rkisp.c b/kernel/drivers/media/platform/rockchip/isp/rkisp.c index 3350646..f65e7e7 100644 --- a/kernel/drivers/media/platform/rockchip/isp/rkisp.c +++ b/kernel/drivers/media/platform/rockchip/isp/rkisp.c @@ -608,6 +608,17 @@ if (is_3dlut_upd) rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true); + /* if output stream enable, wait it end */ + val = rkisp_read(dev, CIF_MI_CTRL_SHD, true); + if (val & CIF_MI_CTRL_SHD_MP_OUT_ENABLED) + dev->irq_ends_mask |= ISP_FRAME_MP; + else + dev->irq_ends_mask &= ~ISP_FRAME_MP; + if (val & CIF_MI_CTRL_SHD_SP_OUT_ENABLED) + dev->irq_ends_mask |= ISP_FRAME_SP; + else + dev->irq_ends_mask &= ~ISP_FRAME_SP; + memset(dev->filt_state, 0, sizeof(dev->filt_state)); dev->filt_state[RDBK_F_VS] = dma2frm; @@ -735,12 +746,27 @@ if (!completion_done(&dev->hw_dev->monitor.cmpl)) complete(&dev->hw_dev->monitor.cmpl); } - if (dev->irq_ends != dev->irq_ends_mask || !IS_HDR_RDBK(dev->rd_mode)) + if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask || + !IS_HDR_RDBK(dev->rd_mode)) return; - if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC))) - dev->isp_state = ISP_STOP; + /* check output stream is off */ + val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC; + if (!(dev->irq_ends_mask & val)) { + u32 state = dev->isp_state; + struct rkisp_stream *s; + for (val = 0; val <= RKISP_STREAM_SP; val++) { + s = &dev->cap_dev.stream[val]; + dev->isp_state = ISP_STOP; + if (s->streaming) { + dev->isp_state = state; + break; + } + } + } + + val = 0; dev->irq_ends = 0; switch (dev->rd_mode) { case HDR_RDBK_FRAME3://for rd1 rd0 rd2 @@ -754,8 +780,6 @@ /* FALLTHROUGH */ } rkisp2_rawrd_isr(val, dev); - if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC))) - dev->isp_state = ISP_STOP; if (dev->dmarx_dev.trigger == T_MANUAL) rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL); if (dev->isp_state == ISP_STOP) @@ -1382,6 +1406,10 @@ ret = -EINVAL; } + /* fix 3a_wr no output with selfpath */ + if (dev->isp_ver == ISP_V21) + dpcl |= CIF_VI_DPCL_CHAN_MODE_MP | CIF_VI_DPCL_MP_MUX_MRSZ_MI; + writel(dpcl, dev->base_addr + CIF_VI_DPCL); return ret; @@ -1483,13 +1511,6 @@ if (atomic_read(&dev->hw_dev->refcnt) > 1) goto end; - - if (dev->hw_dev->monitor.is_en) { - dev->hw_dev->monitor.is_en = 0; - dev->hw_dev->monitor.state = ISP_STOP; - if (!completion_done(&dev->hw_dev->monitor.cmpl)) - complete(&dev->hw_dev->monitor.cmpl); - } /* * ISP(mi) stop in mi frame end -> Stop ISP(mipi) -> * Stop ISP(isp) ->wait for ISP isp off @@ -2241,7 +2262,7 @@ if (dev->hw_dev->is_single) { for (i = 0; i < RKISP_MAX_STREAM; i++) { stream = &dev->cap_dev.stream[i]; - if (stream->streaming) + if (stream->streaming && !stream->next_buf) stream->ops->frame_end(stream); } } @@ -2252,7 +2273,6 @@ struct rkisp_device *isp_dev = sd_to_isp_dev(sd); if (!on) { - rkisp_stop_3a_run(isp_dev); wait_event_timeout(isp_dev->sync_onoff, isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) && (!IS_HDR_RDBK(isp_dev->rd_mode) || @@ -2260,6 +2280,7 @@ rkisp_isp_stop(isp_dev); atomic_dec(&isp_dev->hw_dev->refcnt); rkisp_params_stream_stop(&isp_dev->params_vdev); + rkisp_stop_3a_run(isp_dev); return 0; } -- Gitblit v1.6.2