hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/media/platform/rockchip/isp/rkisp.c
....@@ -213,17 +213,16 @@
213213 max_h = CIF_ISP_INPUT_H_MAX_V21;
214214 break;
215215 case ISP_V30:
216
- if (dev->hw_dev->is_unite) {
217
- max_w = CIF_ISP_INPUT_W_MAX_V30_UNITE;
218
- max_h = CIF_ISP_INPUT_H_MAX_V30_UNITE;
219
- } else {
220
- max_w = CIF_ISP_INPUT_W_MAX_V30;
221
- max_h = CIF_ISP_INPUT_H_MAX_V30;
222
- }
216
+ max_w = dev->hw_dev->unite ?
217
+ CIF_ISP_INPUT_W_MAX_V30_UNITE : CIF_ISP_INPUT_W_MAX_V30;
218
+ max_h = dev->hw_dev->unite ?
219
+ CIF_ISP_INPUT_H_MAX_V30_UNITE : CIF_ISP_INPUT_H_MAX_V30;
223220 break;
224221 case ISP_V32:
225
- max_w = CIF_ISP_INPUT_W_MAX_V32;
226
- max_h = CIF_ISP_INPUT_H_MAX_V32;
222
+ max_w = dev->hw_dev->unite ?
223
+ CIF_ISP_INPUT_W_MAX_V32_UNITE : CIF_ISP_INPUT_W_MAX_V32;
224
+ max_h = dev->hw_dev->unite ?
225
+ CIF_ISP_INPUT_H_MAX_V32_UNITE : CIF_ISP_INPUT_H_MAX_V32;
227226 break;
228227 case ISP_V32_L:
229228 max_w = CIF_ISP_INPUT_W_MAX_V32_L;
....@@ -518,7 +517,9 @@
518517 do_div(data_rate, 1000 * 1000);
519518 /* increase margin: 25% * num */
520519 data_rate += (data_rate >> 2) * num;
521
-
520
+ /* one frame two-run, data double */
521
+ if (hw->is_multi_overflow && num > 1)
522
+ data_rate *= 2;
522523 /* compare with isp clock adjustment table */
523524 for (i = 0; i < hw->num_clk_rate_tbl; i++)
524525 if (data_rate <= hw->clk_rate_tbl[i].clk_rate)
....@@ -528,7 +529,7 @@
528529
529530 /* set isp clock rate */
530531 rkisp_set_clk_rate(hw->clks[0], hw->clk_rate_tbl[i].clk_rate * 1000000UL);
531
- if (hw->is_unite)
532
+ if (hw->unite == ISP_UNITE_TWO)
532533 rkisp_set_clk_rate(hw->clks[5], hw->clk_rate_tbl[i].clk_rate * 1000000UL);
533534 /* aclk equal to core clk */
534535 if (dev->isp_ver == ISP_V32)
....@@ -541,48 +542,39 @@
541542 struct rkisp_hw_dev *hw = dev->hw_dev;
542543
543544 if (on) {
544
- /* enable bay3d and mi */
545
+ /* enable mi */
545546 rkisp_update_regs(dev, ISP3X_MI_WR_CTRL, ISP3X_MI_WR_CTRL);
546547 rkisp_update_regs(dev, ISP3X_ISP_CTRL1, ISP3X_ISP_CTRL1);
547
- if (dev->isp_ver == ISP_V21) {
548
- rkisp_update_regs(dev, ISP21_BAY3D_CTRL, ISP21_BAY3D_CTRL);
549
- } else if (dev->isp_ver == ISP_V30) {
548
+ if (dev->isp_ver == ISP_V30) {
550549 rkisp_update_regs(dev, ISP3X_MPFBC_CTRL, ISP3X_MPFBC_CTRL);
551550 rkisp_update_regs(dev, ISP3X_MI_BP_WR_CTRL, ISP3X_MI_BP_WR_CTRL);
552
- rkisp_update_regs(dev, ISP3X_BAY3D_CTRL, ISP3X_BAY3D_CTRL);
553551 rkisp_update_regs(dev, ISP3X_SWS_CFG, ISP3X_SWS_CFG);
554552 } else if (dev->isp_ver == ISP_V32) {
555553 rkisp_update_regs(dev, ISP3X_MI_BP_WR_CTRL, ISP3X_MI_BP_WR_CTRL);
556554 rkisp_update_regs(dev, ISP32_MI_BPDS_WR_CTRL, ISP32_MI_BPDS_WR_CTRL);
557555 rkisp_update_regs(dev, ISP32_MI_MPDS_WR_CTRL, ISP32_MI_MPDS_WR_CTRL);
558
- rkisp_update_regs(dev, ISP3X_BAY3D_CTRL, ISP3X_BAY3D_CTRL);
559556 }
560557 } else {
561
- /* disabled bay3d and mi. rv1106 sdmmc workaround, 3a_wr no close */
558
+ /* disabled mi. rv1106 sdmmc workaround, 3a_wr no close */
562559 writel(CIF_MI_CTRL_INIT_OFFSET_EN | CIF_MI_CTRL_INIT_BASE_EN,
563560 hw->base_addr + ISP3X_MI_WR_CTRL);
564
- if (dev->isp_ver == ISP_V21) {
565
- writel(0, hw->base_addr + ISP21_BAY3D_CTRL);
566
- } else if (dev->isp_ver == ISP_V30) {
561
+ if (dev->isp_ver == ISP_V30) {
567562 writel(0, hw->base_addr + ISP3X_MPFBC_CTRL);
568563 writel(0, hw->base_addr + ISP3X_MI_BP_WR_CTRL);
569
- writel(0, hw->base_addr + ISP3X_BAY3D_CTRL);
570564 writel(0xc, hw->base_addr + ISP3X_SWS_CFG);
571
- if (hw->is_unite) {
565
+ if (hw->unite == ISP_UNITE_TWO) {
572566 writel(0, hw->base_next_addr + ISP3X_MI_WR_CTRL);
573567 writel(0, hw->base_next_addr + ISP3X_MPFBC_CTRL);
574568 writel(0, hw->base_next_addr + ISP3X_MI_BP_WR_CTRL);
575
- writel(0, hw->base_next_addr + ISP3X_BAY3D_CTRL);
576569 writel(0xc, hw->base_next_addr + ISP3X_SWS_CFG);
577570 }
578571 } else if (dev->isp_ver == ISP_V32) {
579572 writel(0, hw->base_addr + ISP3X_MI_BP_WR_CTRL);
580573 writel(0, hw->base_addr + ISP32_MI_BPDS_WR_CTRL);
581574 writel(0, hw->base_addr + ISP32_MI_MPDS_WR_CTRL);
582
- writel(0, hw->base_addr + ISP3X_BAY3D_CTRL);
583575 }
584576 }
585
- rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true, hw->is_unite);
577
+ rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true);
586578 }
587579
588580 /*
....@@ -602,7 +594,8 @@
602594 hw->cur_dev_id = dev->dev_id;
603595 rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true);
604596
605
- if (hw->is_multi_overflow && is_try)
597
+ /* isp process the same frame */
598
+ if (is_try)
606599 goto run_next;
607600
608601 val = 0;
....@@ -632,13 +625,12 @@
632625 }
633626
634627 if (rd_mode != dev->rd_mode) {
635
- rkisp_unite_set_bits(dev, ISP_HDRMGE_BASE, ISP_HDRMGE_MODE_MASK,
636
- val, false, hw->is_unite);
628
+ rkisp_unite_set_bits(dev, ISP_HDRMGE_BASE, ISP_HDRMGE_MODE_MASK, val, false);
637629 dev->skip_frame = 2;
638630 is_upd = true;
639631 }
640632
641
- if (dev->isp_ver == ISP_V20 && dev->dmarx_dev.trigger == T_MANUAL && !is_try) {
633
+ if (dev->isp_ver == ISP_V20 && dev->dmarx_dev.trigger == T_MANUAL) {
642634 if (dev->rd_mode != rd_mode && dev->br_dev.en) {
643635 tmp = dev->isp_sdev.in_crop.height;
644636 val = rkisp_read(dev, CIF_DUAL_CROP_CTRL, false);
....@@ -659,12 +651,15 @@
659651 }
660652 dev->rd_mode = rd_mode;
661653
662
- rkisp_params_first_cfg(&dev->params_vdev, &dev->isp_sdev.in_fmt,
663
- dev->isp_sdev.quantization);
664
- rkisp_params_cfg(params_vdev, cur_frame_id);
665
- rkisp_config_cmsk(dev);
666
- rkisp_stream_frame_start(dev, 0);
667
- if (!hw->is_single && !is_try) {
654
+ if (hw->unite != ISP_UNITE_ONE || dev->unite_index == ISP_UNITE_LEFT) {
655
+ rkisp_params_first_cfg(&dev->params_vdev, &dev->isp_sdev.in_fmt,
656
+ dev->isp_sdev.quantization);
657
+ rkisp_params_cfg(params_vdev, cur_frame_id);
658
+ rkisp_config_cmsk(dev);
659
+ rkisp_stream_frame_start(dev, 0);
660
+ }
661
+
662
+ if (!hw->is_single) {
668663 /* multi sensor need to reset isp resize mode if scale up */
669664 val = 0;
670665 if (rkisp_read(dev, ISP3X_MAIN_RESIZE_CTRL, true) & 0xf0)
....@@ -700,7 +695,7 @@
700695 } else {
701696 if (dev->isp_ver == ISP_V32_L)
702697 rkisp_write(dev, ISP32_SELF_SCALE_UPDATE, ISP32_SCALE_FORCE_UPD, true);
703
- rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true, hw->is_unite);
698
+ rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true);
704699 }
705700 /* sensor mode & index */
706701 if (dev->isp_ver >= ISP_V21) {
....@@ -711,7 +706,7 @@
711706 else
712707 val |= ISP21_SENSOR_MODE(dev->multi_mode);
713708 writel(val, hw->base_addr + ISP_ACQ_H_OFFS);
714
- if (hw->is_unite)
709
+ if (hw->unite == ISP_UNITE_TWO)
715710 writel(val, hw->base_next_addr + ISP_ACQ_H_OFFS);
716711 v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
717712 "sensor mode:%d index:%d | 0x%x\n",
....@@ -731,36 +726,88 @@
731726 else
732727 dev->rdbk_cnt_x1++;
733728 dev->rdbk_cnt++;
734
-
735
- rkisp_params_cfgsram(params_vdev);
736
- params_vdev->rdbk_times = dma2frm + 1;
729
+ if (dev->isp_ver == ISP_V20)
730
+ params_vdev->rdbk_times = dma2frm + 1;
737731
738732 run_next:
739
- if (hw->is_multi_overflow && !dev->is_first_double) {
740
- stats_vdev->rdbk_drop = false;
741
- if (dev->sw_rd_cnt) {
742
- rkisp_multi_overflow_hdl(dev, false);
743
- params_vdev->rdbk_times += dev->sw_rd_cnt;
744
- stats_vdev->rdbk_drop = true;
745
- is_upd = true;
746
- } else if (is_try) {
733
+ rkisp_params_cfgsram(params_vdev);
734
+ stats_vdev->rdbk_drop = false;
735
+ if (dev->is_frame_double) {
736
+ is_upd = true;
737
+ if (is_try) {
738
+ /* the frame second running to on mi */
747739 rkisp_multi_overflow_hdl(dev, true);
748
- is_upd = true;
740
+ rkisp_update_regs(dev, ISP_LDCH_BASE, ISP_LDCH_BASE);
741
+
742
+ val = ISP3X_YNR_FST_FRAME | ISP3X_DHAZ_FST_FRAME | ISP3X_CNR_FST_FRAME;
743
+ if (dev->isp_ver == ISP_V32)
744
+ val |= ISP32_SHP_FST_FRAME;
745
+ else
746
+ val |= ISP3X_CNR_FST_FRAME;
747
+ rkisp_unite_clear_bits(dev, ISP3X_ISP_CTRL1, val, false);
748
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_IIRWG_GAIN);
749
+ writel(val, hw->base_addr + ISP3X_DRC_IIRWG_GAIN);
750
+ if (hw->unite == ISP_UNITE_TWO)
751
+ writel(val, hw->base_next_addr + ISP3X_DRC_IIRWG_GAIN);
752
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_EXPLRATIO);
753
+ writel(val, hw->base_addr + ISP3X_DRC_EXPLRATIO);
754
+ if (hw->unite == ISP_UNITE_TWO)
755
+ writel(val, hw->base_next_addr + ISP3X_DRC_EXPLRATIO);
756
+ } else {
757
+ /* the frame first running to off mi to save bandwidth */
758
+ rkisp_multi_overflow_hdl(dev, false);
759
+
760
+ /* FST_FRAME no to read sram thumb */
761
+ val = ISP3X_YNR_FST_FRAME | ISP3X_DHAZ_FST_FRAME;
762
+ if (dev->isp_ver == ISP_V32)
763
+ val |= ISP32_SHP_FST_FRAME;
764
+ else
765
+ val |= ISP3X_CNR_FST_FRAME;
766
+ rkisp_unite_set_bits(dev, ISP3X_ISP_CTRL1, 0, val, false);
767
+ /* ADRC low iir thumb weight for first sensor switch */
768
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_IIRWG_GAIN);
769
+ val &= ~ISP3X_DRC_IIR_WEIGHT_MASK;
770
+ writel(val, hw->base_addr + ISP3X_DRC_IIRWG_GAIN);
771
+ if (hw->unite == ISP_UNITE_TWO)
772
+ writel(val, hw->base_next_addr + ISP3X_DRC_IIRWG_GAIN);
773
+ /* ADRC iir5x5 and cur3x3 weight */
774
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_EXPLRATIO);
775
+ val &= ~ISP3X_DRC_WEIPRE_FRAME_MASK;
776
+ writel(val, hw->base_addr + ISP3X_DRC_EXPLRATIO);
777
+ if (hw->unite == ISP_UNITE_TWO)
778
+ writel(val, hw->base_next_addr + ISP3X_DRC_EXPLRATIO);
779
+ /* YNR_THUMB_MIX_CUR_EN for thumb read addr to 0 */
780
+ val = rkisp_read_reg_cache(dev, ISP3X_YNR_GLOBAL_CTRL);
781
+ val |= ISP3X_YNR_THUMB_MIX_CUR_EN;
782
+ writel(val, hw->base_addr + ISP3X_YNR_GLOBAL_CTRL);
783
+ if (hw->unite == ISP_UNITE_TWO)
784
+ writel(val, hw->base_next_addr + ISP3X_YNR_GLOBAL_CTRL);
785
+ if (dev->isp_ver == ISP_V21 || dev->isp_ver == ISP_V30) {
786
+ /* CNR_THUMB_MIX_CUR_EN for thumb read addr to 0 */
787
+ val = rkisp_read_reg_cache(dev, ISP3X_CNR_CTRL);
788
+ val |= ISP3X_CNR_THUMB_MIX_CUR_EN;
789
+ writel(val, hw->base_addr + ISP3X_CNR_CTRL);
790
+ if (hw->unite == ISP_UNITE_TWO)
791
+ writel(val, hw->base_next_addr + ISP3X_CNR_CTRL);
792
+ }
793
+ stats_vdev->rdbk_drop = true;
749794 }
750795 }
751796
752
- /* read 3d lut at frame end */
797
+ /* disable isp force update to read 3dlut
798
+ * 3dlut auto update at frame end for single sensor
799
+ */
753800 if (hw->is_single && is_upd &&
754801 rkisp_read_reg_cache(dev, ISP_3DLUT_UPDATE) & 0x1) {
755
- rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 0, true, hw->is_unite);
802
+ rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 0, true);
756803 is_3dlut_upd = true;
757804 }
758805 if (is_upd) {
759806 val = rkisp_read(dev, ISP_CTRL, false);
760807 val |= CIF_ISP_CTRL_ISP_CFG_UPD;
761
- rkisp_unite_write(dev, ISP_CTRL, val, true, hw->is_unite);
808
+ rkisp_unite_write(dev, ISP_CTRL, val, true);
762809 /* bayer pat after ISP_CFG_UPD for multi sensor to read lsc r/g/b table */
763
- rkisp_update_regs(dev, ISP_ACQ_PROP, ISP_ACQ_PROP);
810
+ rkisp_update_regs(dev, ISP3X_ISP_CTRL1, ISP3X_ISP_CTRL1);
764811 /* fix ldch multi sensor case:
765812 * ldch will pre-read data when en and isp force upd or frame end,
766813 * udelay for ldch pre-read data.
....@@ -771,12 +818,12 @@
771818 udelay(50);
772819 val &= ~(BIT(0) | BIT(31));
773820 writel(val, hw->base_addr + ISP_LDCH_BASE);
774
- if (hw->is_unite)
821
+ if (hw->unite == ISP_UNITE_TWO)
775822 writel(val, hw->base_next_addr + ISP_LDCH_BASE);
776823 }
777824 }
778825 if (is_3dlut_upd)
779
- rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 1, true, hw->is_unite);
826
+ rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 1, true);
780827
781828 /* if output stream enable, wait it end */
782829 val = rkisp_read(dev, CIF_MI_CTRL_SHD, true);
....@@ -807,11 +854,13 @@
807854 val &= ~SW_IBUF_OP_MODE(0xf);
808855 tmp = SW_IBUF_OP_MODE(dev->rd_mode);
809856 val |= tmp | SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm);
857
+ if (dev->isp_ver > ISP_V20)
858
+ dma2frm = dev->sw_rd_cnt;
810859 v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
811
- "readback frame:%d time:%d 0x%x\n",
812
- cur_frame_id, dma2frm + 1, val);
860
+ "readback frame:%d time:%d 0x%x try:%d\n",
861
+ cur_frame_id, dma2frm + 1, val, is_try);
813862 if (!hw->is_shutdown)
814
- rkisp_unite_write(dev, CSI2RX_CTRL0, val, true, hw->is_unite);
863
+ rkisp_unite_write(dev, CSI2RX_CTRL0, val, true);
815864 }
816865
817866 static void rkisp_fast_switch_rx_buf(struct rkisp_device *dev, bool is_current)
....@@ -865,6 +914,12 @@
865914 isp = dev;
866915 is_try = true;
867916 times = 0;
917
+ if (hw->unite == ISP_UNITE_ONE) {
918
+ if (dev->sw_rd_cnt < 2)
919
+ isp->unite_index = ISP_UNITE_RIGHT;
920
+ if (!hw->is_multi_overflow || (dev->sw_rd_cnt & 0x1))
921
+ is_try = false;
922
+ }
868923 goto end;
869924 }
870925 hw->is_idle = true;
....@@ -914,17 +969,40 @@
914969 times = t.times;
915970 hw->cur_dev_id = id;
916971 hw->is_idle = false;
972
+ /* this frame will read count by isp */
917973 isp->sw_rd_cnt = 0;
918
- if (hw->is_multi_overflow && (hw->pre_dev_id != id)) {
974
+ /* frame double for multi camera resolution out of hardware limit
975
+ * first for HW save this camera information, and second to output image
976
+ */
977
+ isp->is_frame_double = false;
978
+ if (hw->is_multi_overflow &&
979
+ (hw->unite == ISP_UNITE_ONE ||
980
+ (hw->pre_dev_id != -1 && hw->pre_dev_id != id))) {
981
+ isp->is_frame_double = true;
919982 isp->sw_rd_cnt = 1;
920983 times = 0;
921984 }
985
+ /* resolution out of hardware limit
986
+ * frame is vertically divided into left and right
987
+ */
988
+ isp->unite_index = ISP_UNITE_LEFT;
989
+ if (hw->unite == ISP_UNITE_ONE) {
990
+ isp->sw_rd_cnt *= 2;
991
+ isp->sw_rd_cnt += 1;
992
+ }
993
+ /* first frame handle twice for thunderboot
994
+ * first output stats to AIQ and wait new params to run second
995
+ */
922996 if (isp->is_pre_on && t.frame_id == 0) {
923997 isp->is_first_double = true;
924998 isp->skip_frame = 1;
925
- isp->sw_rd_cnt = 0;
999
+ if (hw->unite != ISP_UNITE_ONE) {
1000
+ isp->sw_rd_cnt = 0;
1001
+ isp->is_frame_double = false;
1002
+ }
9261003 rkisp_fast_switch_rx_buf(isp, false);
9271004 }
1005
+ isp->params_vdev.rdbk_times = isp->sw_rd_cnt + 1;
9281006 }
9291007 end:
9301008 spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
....@@ -982,12 +1060,6 @@
9821060 {
9831061 u32 val = 0;
9841062
985
- if (dev->hw_dev->is_multi_overflow &&
986
- dev->sw_rd_cnt &&
987
- irq & ISP_FRAME_END &&
988
- !dev->is_first_double)
989
- goto end;
990
-
9911063 dev->irq_ends |= (irq & dev->irq_ends_mask);
9921064 v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
9931065 "%s irq:0x%x ends:0x%x mask:0x%x\n",
....@@ -1001,6 +1073,9 @@
10011073 if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask ||
10021074 !IS_HDR_RDBK(dev->rd_mode))
10031075 return;
1076
+
1077
+ if (dev->sw_rd_cnt)
1078
+ goto end;
10041079
10051080 if (dev->is_first_double) {
10061081 rkisp_fast_switch_rx_buf(dev, true);
....@@ -1068,26 +1143,25 @@
10681143 {
10691144 struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop;
10701145 u32 width = out_crop->width, mult = 1;
1071
- bool is_unite = dev->hw_dev->is_unite;
1146
+ u32 unite = dev->hw_dev->unite;
10721147
10731148 /* isp2.0 no ism */
10741149 if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21 ||
10751150 dev->isp_ver == ISP_V32_L)
10761151 return;
10771152
1078
- if (is_unite)
1153
+ if (unite)
10791154 width = width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
1080
- rkisp_unite_write(dev, CIF_ISP_IS_RECENTER, 0, false, is_unite);
1081
- rkisp_unite_write(dev, CIF_ISP_IS_MAX_DX, 0, false, is_unite);
1082
- rkisp_unite_write(dev, CIF_ISP_IS_MAX_DY, 0, false, is_unite);
1083
- rkisp_unite_write(dev, CIF_ISP_IS_DISPLACE, 0, false, is_unite);
1084
- rkisp_unite_write(dev, CIF_ISP_IS_H_OFFS, out_crop->left, false, is_unite);
1085
- rkisp_unite_write(dev, CIF_ISP_IS_V_OFFS, out_crop->top, false, is_unite);
1086
- rkisp_unite_write(dev, CIF_ISP_IS_H_SIZE, width, false, is_unite);
1155
+ rkisp_unite_write(dev, CIF_ISP_IS_RECENTER, 0, false);
1156
+ rkisp_unite_write(dev, CIF_ISP_IS_MAX_DX, 0, false);
1157
+ rkisp_unite_write(dev, CIF_ISP_IS_MAX_DY, 0, false);
1158
+ rkisp_unite_write(dev, CIF_ISP_IS_DISPLACE, 0, false);
1159
+ rkisp_unite_write(dev, CIF_ISP_IS_H_OFFS, out_crop->left, false);
1160
+ rkisp_unite_write(dev, CIF_ISP_IS_V_OFFS, out_crop->top, false);
1161
+ rkisp_unite_write(dev, CIF_ISP_IS_H_SIZE, width, false);
10871162 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced)
10881163 mult = 2;
1089
- rkisp_unite_write(dev, CIF_ISP_IS_V_SIZE, out_crop->height / mult,
1090
- false, is_unite);
1164
+ rkisp_unite_write(dev, CIF_ISP_IS_V_SIZE, out_crop->height / mult, false);
10911165
10921166 if (dev->isp_ver == ISP_V30 || dev->isp_ver == ISP_V32)
10931167 return;
....@@ -1389,20 +1463,18 @@
13891463
13901464 for (i = 0; i < 9; i++)
13911465 rkisp_unite_write(dev, CIF_ISP_CC_COEFF_0 + i * 4,
1392
- *(coeff + i), false, dev->hw_dev->is_unite);
1466
+ *(coeff + i), false);
13931467
13941468 val = rkisp_read_reg_cache(dev, CIF_ISP_CTRL);
13951469
13961470 if (dev->isp_sdev.quantization == V4L2_QUANTIZATION_FULL_RANGE)
13971471 rkisp_unite_write(dev, CIF_ISP_CTRL, val |
13981472 CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1399
- CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA,
1400
- false, dev->hw_dev->is_unite);
1473
+ CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA, false);
14011474 else
14021475 rkisp_unite_write(dev, CIF_ISP_CTRL, val &
14031476 ~(CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1404
- CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA),
1405
- false, dev->hw_dev->is_unite);
1477
+ CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA), false);
14061478 }
14071479
14081480 static void rkisp_config_cmsk_single(struct rkisp_device *dev,
....@@ -1601,7 +1673,7 @@
16011673 cfg = dev->cmsk_cfg;
16021674 spin_unlock_irqrestore(&dev->cmsk_lock, lock_flags);
16031675
1604
- if (!dev->hw_dev->is_unite)
1676
+ if (!dev->hw_dev->unite)
16051677 rkisp_config_cmsk_single(dev, &cfg);
16061678 else
16071679 rkisp_config_cmsk_dual(dev, &cfg);
....@@ -1616,7 +1688,7 @@
16161688 struct ispsd_out_fmt *out_fmt;
16171689 struct v4l2_rect *in_crop;
16181690 struct rkisp_sensor_info *sensor;
1619
- bool is_unite = dev->hw_dev->is_unite;
1691
+ bool is_unite = !!dev->hw_dev->unite;
16201692 u32 isp_ctrl = 0;
16211693 u32 irq_mask = 0;
16221694 u32 signal = 0;
....@@ -1646,22 +1718,20 @@
16461718 in_fmt->mbus_code == MEDIA_BUS_FMT_Y10_1X10 ||
16471719 in_fmt->mbus_code == MEDIA_BUS_FMT_Y12_1X12) {
16481720 if (dev->isp_ver >= ISP_V20)
1649
- rkisp_unite_write(dev, ISP_DEBAYER_CONTROL,
1650
- 0, false, is_unite);
1721
+ rkisp_unite_write(dev, ISP_DEBAYER_CONTROL, 0, false);
16511722 else
16521723 rkisp_write(dev, CIF_ISP_DEMOSAIC,
1653
- CIF_ISP_DEMOSAIC_BYPASS |
1654
- CIF_ISP_DEMOSAIC_TH(0xc), false);
1724
+ CIF_ISP_DEMOSAIC_BYPASS |
1725
+ CIF_ISP_DEMOSAIC_TH(0xc), false);
16551726 } else {
16561727 if (dev->isp_ver >= ISP_V20)
16571728 rkisp_unite_write(dev, ISP_DEBAYER_CONTROL,
16581729 SW_DEBAYER_EN |
16591730 SW_DEBAYER_FILTER_G_EN |
1660
- SW_DEBAYER_FILTER_C_EN,
1661
- false, is_unite);
1731
+ SW_DEBAYER_FILTER_C_EN, false);
16621732 else
16631733 rkisp_write(dev, CIF_ISP_DEMOSAIC,
1664
- CIF_ISP_DEMOSAIC_TH(0xc), false);
1734
+ CIF_ISP_DEMOSAIC_TH(0xc), false);
16651735 }
16661736
16671737 if (sensor && sensor->mbus.type == V4L2_MBUS_BT656)
....@@ -1714,38 +1784,31 @@
17141784 if (rkisp_read_reg_cache(dev, CIF_ISP_CTRL) & ISP32_MIR_ENABLE)
17151785 isp_ctrl |= ISP32_MIR_ENABLE;
17161786
1717
- rkisp_unite_write(dev, CIF_ISP_CTRL, isp_ctrl, false, is_unite);
1787
+ rkisp_unite_write(dev, CIF_ISP_CTRL, isp_ctrl, false);
17181788 acq_prop |= signal | in_fmt->yuv_seq |
17191789 CIF_ISP_ACQ_PROP_BAYER_PAT(in_fmt->bayer_pat) |
17201790 CIF_ISP_ACQ_PROP_FIELD_SEL_ALL;
1721
- rkisp_unite_write(dev, CIF_ISP_ACQ_PROP, acq_prop, false, is_unite);
1722
- rkisp_unite_write(dev, CIF_ISP_ACQ_NR_FRAMES, 0, true, is_unite);
1791
+ rkisp_unite_write(dev, CIF_ISP_ACQ_PROP, acq_prop, false);
1792
+ rkisp_unite_write(dev, CIF_ISP_ACQ_NR_FRAMES, 0, true);
17231793
17241794 if (is_unite)
17251795 width = width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
17261796 /* Acquisition Size */
1727
- rkisp_unite_write(dev, CIF_ISP_ACQ_H_OFFS, acq_mult * in_crop->left,
1728
- false, is_unite);
1729
- rkisp_unite_write(dev, CIF_ISP_ACQ_V_OFFS, in_crop->top,
1730
- false, is_unite);
1731
- rkisp_unite_write(dev, CIF_ISP_ACQ_H_SIZE, acq_mult * width,
1732
- false, is_unite);
1797
+ rkisp_unite_write(dev, CIF_ISP_ACQ_H_OFFS, acq_mult * in_crop->left, false);
1798
+ rkisp_unite_write(dev, CIF_ISP_ACQ_V_OFFS, in_crop->top, false);
1799
+ rkisp_unite_write(dev, CIF_ISP_ACQ_H_SIZE, acq_mult * width, false);
17331800
17341801 /* ISP Out Area differ with ACQ is only FIFO, so don't crop in this */
1735
- rkisp_unite_write(dev, CIF_ISP_OUT_H_OFFS, 0, true, is_unite);
1736
- rkisp_unite_write(dev, CIF_ISP_OUT_V_OFFS, 0, true, is_unite);
1737
- rkisp_unite_write(dev, CIF_ISP_OUT_H_SIZE, width, false, is_unite);
1802
+ rkisp_unite_write(dev, CIF_ISP_OUT_H_OFFS, 0, true);
1803
+ rkisp_unite_write(dev, CIF_ISP_OUT_V_OFFS, 0, true);
1804
+ rkisp_unite_write(dev, CIF_ISP_OUT_H_SIZE, width, false);
17381805
17391806 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) {
1740
- rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height / 2,
1741
- false, is_unite);
1742
- rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height / 2,
1743
- false, is_unite);
1807
+ rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height / 2, false);
1808
+ rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height / 2, false);
17441809 } else {
1745
- rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height + extend_line,
1746
- false, is_unite);
1747
- rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height + extend_line,
1748
- false, is_unite);
1810
+ rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height + extend_line, false);
1811
+ rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height + extend_line, false);
17491812 }
17501813
17511814 /* interrupt mask */
....@@ -1754,7 +1817,7 @@
17541817 irq_mask |= ISP2X_LSC_LUT_ERR;
17551818 if (dev->is_pre_on)
17561819 irq_mask |= CIF_ISP_FRAME_IN;
1757
- rkisp_unite_write(dev, CIF_ISP_IMSC, irq_mask, true, is_unite);
1820
+ rkisp_unite_write(dev, CIF_ISP_IMSC, irq_mask, true);
17581821
17591822 if ((dev->isp_ver == ISP_V20 ||
17601823 dev->isp_ver == ISP_V21) &&
....@@ -1909,8 +1972,7 @@
19091972 if (dev->isp_ver == ISP_V32)
19101973 dpcl |= BIT(0);
19111974
1912
- rkisp_unite_set_bits(dev, CIF_VI_DPCL, 0, dpcl, true,
1913
- dev->hw_dev->is_unite);
1975
+ rkisp_unite_set_bits(dev, CIF_VI_DPCL, 0, dpcl, true);
19141976 return ret;
19151977 }
19161978
....@@ -2007,9 +2069,9 @@
20072069
20082070 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
20092071 "%s refcnt:%d\n", __func__,
2010
- atomic_read(&dev->hw_dev->refcnt));
2072
+ atomic_read(&hw->refcnt));
20112073
2012
- if (atomic_read(&dev->hw_dev->refcnt) > 1)
2074
+ if (atomic_read(&hw->refcnt) > 1)
20132075 goto end;
20142076 /*
20152077 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
....@@ -2065,7 +2127,7 @@
20652127
20662128 val = readl(base + CIF_ISP_CTRL);
20672129 writel(val | CIF_ISP_CTRL_ISP_CFG_UPD, base + CIF_ISP_CTRL);
2068
- if (hw->is_unite)
2130
+ if (hw->unite == ISP_UNITE_TWO)
20692131 rkisp_next_write(dev, CIF_ISP_CTRL,
20702132 val | CIF_ISP_CTRL_ISP_CFG_UPD, true);
20712133
....@@ -2082,11 +2144,11 @@
20822144 safe_rate = hw->clk_rate_tbl[0].clk_rate * 1000000UL;
20832145 if (old_rate > safe_rate) {
20842146 rkisp_set_clk_rate(hw->clks[0], safe_rate);
2085
- if (hw->is_unite)
2147
+ if (hw->unite == ISP_UNITE_TWO)
20862148 rkisp_set_clk_rate(hw->clks[5], safe_rate);
20872149 udelay(100);
20882150 }
2089
- rkisp_soft_reset(dev->hw_dev, false);
2151
+ rkisp_soft_reset(hw, false);
20902152 }
20912153
20922154 if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) {
....@@ -2097,18 +2159,20 @@
20972159 writel(0, base + CIF_ISP_CSI0_MASK3);
20982160 } else if (dev->isp_ver >= ISP_V20) {
20992161 writel(0, base + CSI2RX_CSI2_RESETN);
2100
- if (hw->is_unite)
2162
+ if (hw->unite == ISP_UNITE_TWO)
21012163 rkisp_next_write(dev, CSI2RX_CSI2_RESETN, 0, true);
21022164 }
21032165
21042166 hw->is_dvfs = false;
21052167 hw->is_runing = false;
2106
- dev->hw_dev->is_idle = true;
2107
- dev->hw_dev->is_mi_update = false;
2168
+ hw->is_idle = true;
2169
+ hw->is_mi_update = false;
2170
+ hw->pre_dev_id = -1;
21082171 end:
21092172 dev->irq_ends_mask = 0;
21102173 dev->hdr.op_mode = 0;
21112174 dev->sw_rd_cnt = 0;
2175
+ dev->stats_vdev.rdbk_drop = false;
21122176 rkisp_set_state(&dev->isp_state, ISP_STOP);
21132177
21142178 if (dev->isp_ver >= ISP_V20)
....@@ -2154,12 +2218,9 @@
21542218 val = dev->isp_sdev.out_crop.height / 15;
21552219 val = dev->cap_dev.wait_line / val;
21562220 val = ISP3X_RAWAF_INELINE0(val) | ISP3X_RAWAF_INTLINE0_EN;
2157
- rkisp_unite_write(dev, ISP3X_RAWAF_INT_LINE,
2158
- val, false, dev->hw_dev->is_unite);
2159
- rkisp_unite_set_bits(dev, ISP_ISP3A_IMSC, 0,
2160
- ISP2X_3A_RAWAF, false, dev->hw_dev->is_unite);
2161
- rkisp_unite_clear_bits(dev, CIF_ISP_IMSC,
2162
- ISP2X_LSC_LUT_ERR, false, dev->hw_dev->is_unite);
2221
+ rkisp_unite_write(dev, ISP3X_RAWAF_INT_LINE, val, false);
2222
+ rkisp_unite_set_bits(dev, ISP_ISP3A_IMSC, 0, ISP2X_3A_RAWAF, false);
2223
+ rkisp_unite_clear_bits(dev, CIF_ISP_IMSC, ISP2X_LSC_LUT_ERR, false);
21632224 dev->rawaf_irq_cnt = 0;
21642225 }
21652226 }
....@@ -2187,12 +2248,11 @@
21872248 val |= NOC_HURRY_PRIORITY(2) | NOC_HURRY_W_MODE(2) | NOC_HURRY_R_MODE(1);
21882249 if (atomic_read(&dev->hw_dev->refcnt) > 1)
21892250 is_direct = false;
2190
- rkisp_unite_write(dev, CIF_ISP_CTRL, val, is_direct, dev->hw_dev->is_unite);
2251
+ rkisp_unite_write(dev, CIF_ISP_CTRL, val, is_direct);
21912252 rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD);
21922253
21932254 dev->isp_err_cnt = 0;
21942255 dev->isp_isr_cnt = 0;
2195
- dev->isp_state = ISP_START | ISP_FRAME_END;
21962256 dev->irq_ends_mask |= ISP_FRAME_END;
21972257 dev->irq_ends = 0;
21982258
....@@ -2668,14 +2728,16 @@
26682728 max_h = CIF_ISP_INPUT_H_MAX_V21;
26692729 break;
26702730 case ISP_V30:
2671
- max_w = dev->hw_dev->is_unite ?
2731
+ max_w = dev->hw_dev->unite ?
26722732 CIF_ISP_INPUT_W_MAX_V30_UNITE : CIF_ISP_INPUT_W_MAX_V30;
2673
- max_h = dev->hw_dev->is_unite ?
2733
+ max_h = dev->hw_dev->unite ?
26742734 CIF_ISP_INPUT_H_MAX_V30_UNITE : CIF_ISP_INPUT_H_MAX_V30;
26752735 break;
26762736 case ISP_V32:
2677
- max_w = CIF_ISP_INPUT_W_MAX_V32;
2678
- max_h = CIF_ISP_INPUT_H_MAX_V32;
2737
+ max_w = dev->hw_dev->unite ?
2738
+ CIF_ISP_INPUT_W_MAX_V32_UNITE : CIF_ISP_INPUT_W_MAX_V32;
2739
+ max_h = dev->hw_dev->unite ?
2740
+ CIF_ISP_INPUT_H_MAX_V32_UNITE : CIF_ISP_INPUT_H_MAX_V32;
26792741 break;
26802742 case ISP_V32_L:
26812743 max_w = CIF_ISP_INPUT_W_MAX_V32_L;
....@@ -2901,6 +2963,7 @@
29012963 rkisp_config_cif(isp_dev);
29022964 rkisp_isp_start(isp_dev);
29032965 rkisp_global_update_mi(isp_dev);
2966
+ isp_dev->isp_state = ISP_START | ISP_FRAME_END;
29042967 rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, NULL);
29052968 return 0;
29062969 }
....@@ -2936,7 +2999,7 @@
29362999 u32 val = pool->buf.buff_addr[RKISP_PLANE_Y];
29373000
29383001 rkisp_write(dev, stream->config->mi.y_base_ad_init, val, false);
2939
- if (dev->hw_dev->is_unite) {
3002
+ if (dev->hw_dev->unite == ISP_UNITE_TWO) {
29403003 u32 offs = stream->out_fmt.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL;
29413004
29423005 if (stream->memory)
....@@ -3412,7 +3475,7 @@
34123475 if (dev->is_bigmode)
34133476 mode |= RKISP_ISP_BIGMODE;
34143477 info->mode = mode;
3415
- if (dev->hw_dev->is_unite)
3478
+ if (dev->hw_dev->unite)
34163479 info->act_width = in_crop->width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
34173480 else
34183481 info->act_width = in_crop->width;
....@@ -3699,7 +3762,7 @@
36993762 struct ispsd_in_fmt *in_fmt = &isp_sd->in_fmt;
37003763 struct ispsd_out_fmt *out_fmt = &isp_sd->out_fmt;
37013764
3702
- *in_fmt = rkisp_isp_input_formats[0];
3765
+ *in_fmt = rkisp_isp_input_formats[8];
37033766 in_frm->width = RKISP_DEFAULT_WIDTH;
37043767 in_frm->height = RKISP_DEFAULT_HEIGHT;
37053768 in_frm->code = in_fmt->mbus_code;
....@@ -3805,8 +3868,52 @@
38053868 })
38063869
38073870 #ifdef CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP
3871
+static void rkisp_save_tb_info(struct rkisp_device *isp_dev)
3872
+{
3873
+ struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev;
3874
+ void *resmem_va = phys_to_virt(isp_dev->resmem_pa);
3875
+ struct rkisp_thunderboot_resmem_head *head = resmem_va;
3876
+ int size = 0, offset = 0;
3877
+ void *param = NULL;
3878
+
3879
+ switch (isp_dev->isp_ver) {
3880
+ case ISP_V32:
3881
+ size = sizeof(struct rkisp32_thunderboot_resmem_head);
3882
+ offset = size * isp_dev->dev_id;
3883
+ break;
3884
+ default:
3885
+ break;
3886
+ }
3887
+
3888
+ if (size && size < isp_dev->resmem_size) {
3889
+ dma_sync_single_for_cpu(isp_dev->dev, isp_dev->resmem_addr + offset,
3890
+ size, DMA_FROM_DEVICE);
3891
+ params_vdev->is_first_cfg = true;
3892
+ if (isp_dev->isp_ver == ISP_V32) {
3893
+ struct rkisp32_thunderboot_resmem_head *tmp = resmem_va + offset;
3894
+
3895
+ param = &tmp->cfg;
3896
+ head = &tmp->head;
3897
+ v4l2_info(&isp_dev->v4l2_dev,
3898
+ "tb param module en:0x%llx upd:0x%llx cfg upd:0x%llx\n",
3899
+ tmp->cfg.module_en_update,
3900
+ tmp->cfg.module_ens,
3901
+ tmp->cfg.module_cfg_update);
3902
+ }
3903
+ if (param)
3904
+ params_vdev->ops->save_first_param(params_vdev, param);
3905
+ } else if (size > isp_dev->resmem_size) {
3906
+ v4l2_err(&isp_dev->v4l2_dev,
3907
+ "resmem size:%zu no enough for head:%d\n",
3908
+ isp_dev->resmem_size, size);
3909
+ head->complete = RKISP_TB_NG;
3910
+ }
3911
+ memcpy(&isp_dev->tb_head, head, sizeof(*head));
3912
+}
3913
+
38083914 void rkisp_chk_tb_over(struct rkisp_device *isp_dev)
38093915 {
3916
+ struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev;
38103917 struct rkisp_hw_dev *hw = isp_dev->hw_dev;
38113918 struct rkisp_thunderboot_resmem_head *head;
38123919 enum rkisp_tb_state tb_state;
....@@ -3815,19 +3922,20 @@
38153922 if (!isp_dev->is_thunderboot)
38163923 return;
38173924
3925
+ if (isp_dev->isp_ver == ISP_V32 && params_vdev->is_first_cfg)
3926
+ goto end;
3927
+
38183928 resmem_va = phys_to_virt(isp_dev->resmem_pa);
38193929 head = (struct rkisp_thunderboot_resmem_head *)resmem_va;
38203930 dma_sync_single_for_cpu(isp_dev->dev, isp_dev->resmem_addr,
38213931 sizeof(struct rkisp_thunderboot_resmem_head),
38223932 DMA_FROM_DEVICE);
38233933
3824
- shm_head_poll_timeout(isp_dev, !!head->complete, 5000, 200 * USEC_PER_MSEC);
3934
+ shm_head_poll_timeout(isp_dev, !!head->complete, 5000, 400 * USEC_PER_MSEC);
38253935 if (head->complete != RKISP_TB_OK) {
38263936 v4l2_err(&isp_dev->v4l2_dev, "wait thunderboot over timeout\n");
38273937 } else {
3828
- struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev;
3829
- void *param = NULL;
3830
- u32 size = 0, offset = 0, timeout = 50;
3938
+ int i, timeout = 50;
38313939
38323940 /* wait for all isp dev to register */
38333941 if (head->camera_num > 1) {
....@@ -3837,42 +3945,18 @@
38373945 break;
38383946 usleep_range(200, 210);
38393947 }
3840
- }
3841
-
3842
- switch (isp_dev->isp_ver) {
3843
- case ISP_V32:
3844
- size = sizeof(struct rkisp32_thunderboot_resmem_head);
3845
- offset = size * isp_dev->dev_id;
3846
- break;
3847
- default:
3848
- break;
3849
- }
3850
-
3851
- if (size && size < isp_dev->resmem_size) {
3852
- dma_sync_single_for_cpu(isp_dev->dev, isp_dev->resmem_addr + offset,
3853
- size, DMA_FROM_DEVICE);
3854
- params_vdev->is_first_cfg = true;
3855
- if (isp_dev->isp_ver == ISP_V32) {
3856
- struct rkisp32_thunderboot_resmem_head *tmp = resmem_va + offset;
3857
-
3858
- param = &tmp->cfg;
3859
- head = &tmp->head;
3860
- v4l2_info(&isp_dev->v4l2_dev,
3861
- "tb param module en:0x%llx upd:0x%llx cfg upd:0x%llx\n",
3862
- tmp->cfg.module_en_update,
3863
- tmp->cfg.module_ens,
3864
- tmp->cfg.module_cfg_update);
3948
+ if (head->camera_num > hw->dev_num) {
3949
+ v4l2_err(&isp_dev->v4l2_dev,
3950
+ "thunderboot invalid camera num:%d, dev num:%d\n",
3951
+ head->camera_num, hw->dev_num);
3952
+ goto end;
38653953 }
3866
- if (param)
3867
- params_vdev->ops->save_first_param(params_vdev, param);
3868
- } else if (size > isp_dev->resmem_size) {
3869
- v4l2_err(&isp_dev->v4l2_dev,
3870
- "resmem size:%zu no enough for head:%d\n",
3871
- isp_dev->resmem_size, size);
3872
- head->complete = RKISP_TB_NG;
38733954 }
3955
+ for (i = 0; i < head->camera_num; i++)
3956
+ rkisp_save_tb_info(hw->isp[i]);
38743957 }
3875
- memcpy(&isp_dev->tb_head, head, sizeof(*head));
3958
+end:
3959
+ head = &isp_dev->tb_head;
38763960 v4l2_info(&isp_dev->v4l2_dev,
38773961 "thunderboot info: %d, %d, %d, %d, %d, %d | %d %d\n",
38783962 head->enable,
....@@ -4005,7 +4089,7 @@
40054089 struct rkisp_device *dev)
40064090 {
40074091 struct rkisp_hw_dev *hw = dev->hw_dev;
4008
- void __iomem *base = !hw->is_unite ?
4092
+ void __iomem *base = hw->unite != ISP_UNITE_TWO ?
40094093 hw->base_addr : hw->base_next_addr;
40104094 unsigned int isp_mis_tmp = 0;
40114095 unsigned int isp_err = 0;
....@@ -4026,7 +4110,7 @@
40264110 if (isp3a_mis & ISP2X_3A_RAWAE_BIG && dev->params_vdev.rdbk_times > 0)
40274111 writel(BIT(31), base + RAWAE_BIG1_BASE + RAWAE_BIG_CTRL);
40284112
4029
- if (hw->is_unite) {
4113
+ if (hw->unite == ISP_UNITE_TWO) {
40304114 u32 val = rkisp_read(dev, ISP3X_ISP_RIS, true);
40314115
40324116 if (val) {
....@@ -4057,9 +4141,14 @@
40574141 }
40584142
40594143 if (IS_HDR_RDBK(dev->hdr.op_mode)) {
4060
- /* read 3d lut at isp readback */
4061
- if (!dev->hw_dev->is_single)
4062
- rkisp_write(dev, ISP_3DLUT_UPDATE, 0, true);
4144
+ /* disabled frame end to read 3dlut for multi sensor
4145
+ * 3dlut will update at isp readback
4146
+ */
4147
+ if (!dev->hw_dev->is_single) {
4148
+ writel(0, hw->base_addr + ISP_3DLUT_UPDATE);
4149
+ if (hw->unite == ISP_UNITE_TWO)
4150
+ writel(0, hw->base_next_addr + ISP_3DLUT_UPDATE);
4151
+ }
40634152 rkisp_stats_rdbk_enable(&dev->stats_vdev, true);
40644153 goto vs_skip;
40654154 }