hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/media/platform/rockchip/isp/rkisp.c
....@@ -608,6 +608,17 @@
608608 if (is_3dlut_upd)
609609 rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true);
610610
611
+ /* if output stream enable, wait it end */
612
+ val = rkisp_read(dev, CIF_MI_CTRL_SHD, true);
613
+ if (val & CIF_MI_CTRL_SHD_MP_OUT_ENABLED)
614
+ dev->irq_ends_mask |= ISP_FRAME_MP;
615
+ else
616
+ dev->irq_ends_mask &= ~ISP_FRAME_MP;
617
+ if (val & CIF_MI_CTRL_SHD_SP_OUT_ENABLED)
618
+ dev->irq_ends_mask |= ISP_FRAME_SP;
619
+ else
620
+ dev->irq_ends_mask &= ~ISP_FRAME_SP;
621
+
611622 memset(dev->filt_state, 0, sizeof(dev->filt_state));
612623 dev->filt_state[RDBK_F_VS] = dma2frm;
613624
....@@ -735,12 +746,27 @@
735746 if (!completion_done(&dev->hw_dev->monitor.cmpl))
736747 complete(&dev->hw_dev->monitor.cmpl);
737748 }
738
- if (dev->irq_ends != dev->irq_ends_mask || !IS_HDR_RDBK(dev->rd_mode))
749
+ if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask ||
750
+ !IS_HDR_RDBK(dev->rd_mode))
739751 return;
740752
741
- if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC)))
742
- dev->isp_state = ISP_STOP;
753
+ /* check output stream is off */
754
+ val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC;
755
+ if (!(dev->irq_ends_mask & val)) {
756
+ u32 state = dev->isp_state;
757
+ struct rkisp_stream *s;
743758
759
+ for (val = 0; val <= RKISP_STREAM_SP; val++) {
760
+ s = &dev->cap_dev.stream[val];
761
+ dev->isp_state = ISP_STOP;
762
+ if (s->streaming) {
763
+ dev->isp_state = state;
764
+ break;
765
+ }
766
+ }
767
+ }
768
+
769
+ val = 0;
744770 dev->irq_ends = 0;
745771 switch (dev->rd_mode) {
746772 case HDR_RDBK_FRAME3://for rd1 rd0 rd2
....@@ -754,8 +780,6 @@
754780 /* FALLTHROUGH */
755781 }
756782 rkisp2_rawrd_isr(val, dev);
757
- if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC)))
758
- dev->isp_state = ISP_STOP;
759783 if (dev->dmarx_dev.trigger == T_MANUAL)
760784 rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL);
761785 if (dev->isp_state == ISP_STOP)
....@@ -1382,6 +1406,10 @@
13821406 ret = -EINVAL;
13831407 }
13841408
1409
+ /* fix 3a_wr no output with selfpath */
1410
+ if (dev->isp_ver == ISP_V21)
1411
+ dpcl |= CIF_VI_DPCL_CHAN_MODE_MP | CIF_VI_DPCL_MP_MUX_MRSZ_MI;
1412
+
13851413 writel(dpcl, dev->base_addr + CIF_VI_DPCL);
13861414
13871415 return ret;
....@@ -1483,13 +1511,6 @@
14831511
14841512 if (atomic_read(&dev->hw_dev->refcnt) > 1)
14851513 goto end;
1486
-
1487
- if (dev->hw_dev->monitor.is_en) {
1488
- dev->hw_dev->monitor.is_en = 0;
1489
- dev->hw_dev->monitor.state = ISP_STOP;
1490
- if (!completion_done(&dev->hw_dev->monitor.cmpl))
1491
- complete(&dev->hw_dev->monitor.cmpl);
1492
- }
14931514 /*
14941515 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
14951516 * Stop ISP(isp) ->wait for ISP isp off
....@@ -2241,7 +2262,7 @@
22412262 if (dev->hw_dev->is_single) {
22422263 for (i = 0; i < RKISP_MAX_STREAM; i++) {
22432264 stream = &dev->cap_dev.stream[i];
2244
- if (stream->streaming)
2265
+ if (stream->streaming && !stream->next_buf)
22452266 stream->ops->frame_end(stream);
22462267 }
22472268 }
....@@ -2252,7 +2273,6 @@
22522273 struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
22532274
22542275 if (!on) {
2255
- rkisp_stop_3a_run(isp_dev);
22562276 wait_event_timeout(isp_dev->sync_onoff,
22572277 isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) &&
22582278 (!IS_HDR_RDBK(isp_dev->rd_mode) ||
....@@ -2260,6 +2280,7 @@
22602280 rkisp_isp_stop(isp_dev);
22612281 atomic_dec(&isp_dev->hw_dev->refcnt);
22622282 rkisp_params_stream_stop(&isp_dev->params_vdev);
2283
+ rkisp_stop_3a_run(isp_dev);
22632284 return 0;
22642285 }
22652286