From 7d07b3ae8ddad407913c5301877e694430a3263f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Thu, 23 Nov 2023 08:24:31 +0000
Subject: [PATCH] add build kerneldeb
---
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