.. | .. |
---|
213 | 213 | max_h = CIF_ISP_INPUT_H_MAX_V21; |
---|
214 | 214 | break; |
---|
215 | 215 | 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; |
---|
223 | 220 | break; |
---|
224 | 221 | 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; |
---|
227 | 226 | break; |
---|
228 | 227 | case ISP_V32_L: |
---|
229 | 228 | max_w = CIF_ISP_INPUT_W_MAX_V32_L; |
---|
.. | .. |
---|
518 | 517 | do_div(data_rate, 1000 * 1000); |
---|
519 | 518 | /* increase margin: 25% * num */ |
---|
520 | 519 | 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; |
---|
522 | 523 | /* compare with isp clock adjustment table */ |
---|
523 | 524 | for (i = 0; i < hw->num_clk_rate_tbl; i++) |
---|
524 | 525 | if (data_rate <= hw->clk_rate_tbl[i].clk_rate) |
---|
.. | .. |
---|
528 | 529 | |
---|
529 | 530 | /* set isp clock rate */ |
---|
530 | 531 | 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) |
---|
532 | 533 | rkisp_set_clk_rate(hw->clks[5], hw->clk_rate_tbl[i].clk_rate * 1000000UL); |
---|
533 | 534 | /* aclk equal to core clk */ |
---|
534 | 535 | if (dev->isp_ver == ISP_V32) |
---|
.. | .. |
---|
541 | 542 | struct rkisp_hw_dev *hw = dev->hw_dev; |
---|
542 | 543 | |
---|
543 | 544 | if (on) { |
---|
544 | | - /* enable bay3d and mi */ |
---|
| 545 | + /* enable mi */ |
---|
545 | 546 | rkisp_update_regs(dev, ISP3X_MI_WR_CTRL, ISP3X_MI_WR_CTRL); |
---|
546 | 547 | 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) { |
---|
550 | 549 | rkisp_update_regs(dev, ISP3X_MPFBC_CTRL, ISP3X_MPFBC_CTRL); |
---|
551 | 550 | 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); |
---|
553 | 551 | rkisp_update_regs(dev, ISP3X_SWS_CFG, ISP3X_SWS_CFG); |
---|
554 | 552 | } else if (dev->isp_ver == ISP_V32) { |
---|
555 | 553 | rkisp_update_regs(dev, ISP3X_MI_BP_WR_CTRL, ISP3X_MI_BP_WR_CTRL); |
---|
556 | 554 | rkisp_update_regs(dev, ISP32_MI_BPDS_WR_CTRL, ISP32_MI_BPDS_WR_CTRL); |
---|
557 | 555 | 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); |
---|
559 | 556 | } |
---|
560 | 557 | } else { |
---|
561 | | - /* disabled bay3d and mi. rv1106 sdmmc workaround, 3a_wr no close */ |
---|
| 558 | + /* disabled mi. rv1106 sdmmc workaround, 3a_wr no close */ |
---|
562 | 559 | writel(CIF_MI_CTRL_INIT_OFFSET_EN | CIF_MI_CTRL_INIT_BASE_EN, |
---|
563 | 560 | 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) { |
---|
567 | 562 | writel(0, hw->base_addr + ISP3X_MPFBC_CTRL); |
---|
568 | 563 | writel(0, hw->base_addr + ISP3X_MI_BP_WR_CTRL); |
---|
569 | | - writel(0, hw->base_addr + ISP3X_BAY3D_CTRL); |
---|
570 | 564 | writel(0xc, hw->base_addr + ISP3X_SWS_CFG); |
---|
571 | | - if (hw->is_unite) { |
---|
| 565 | + if (hw->unite == ISP_UNITE_TWO) { |
---|
572 | 566 | writel(0, hw->base_next_addr + ISP3X_MI_WR_CTRL); |
---|
573 | 567 | writel(0, hw->base_next_addr + ISP3X_MPFBC_CTRL); |
---|
574 | 568 | writel(0, hw->base_next_addr + ISP3X_MI_BP_WR_CTRL); |
---|
575 | | - writel(0, hw->base_next_addr + ISP3X_BAY3D_CTRL); |
---|
576 | 569 | writel(0xc, hw->base_next_addr + ISP3X_SWS_CFG); |
---|
577 | 570 | } |
---|
578 | 571 | } else if (dev->isp_ver == ISP_V32) { |
---|
579 | 572 | writel(0, hw->base_addr + ISP3X_MI_BP_WR_CTRL); |
---|
580 | 573 | writel(0, hw->base_addr + ISP32_MI_BPDS_WR_CTRL); |
---|
581 | 574 | writel(0, hw->base_addr + ISP32_MI_MPDS_WR_CTRL); |
---|
582 | | - writel(0, hw->base_addr + ISP3X_BAY3D_CTRL); |
---|
583 | 575 | } |
---|
584 | 576 | } |
---|
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); |
---|
586 | 578 | } |
---|
587 | 579 | |
---|
588 | 580 | /* |
---|
.. | .. |
---|
602 | 594 | hw->cur_dev_id = dev->dev_id; |
---|
603 | 595 | rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true); |
---|
604 | 596 | |
---|
605 | | - if (hw->is_multi_overflow && is_try) |
---|
| 597 | + /* isp process the same frame */ |
---|
| 598 | + if (is_try) |
---|
606 | 599 | goto run_next; |
---|
607 | 600 | |
---|
608 | 601 | val = 0; |
---|
.. | .. |
---|
632 | 625 | } |
---|
633 | 626 | |
---|
634 | 627 | 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); |
---|
637 | 629 | dev->skip_frame = 2; |
---|
638 | 630 | is_upd = true; |
---|
639 | 631 | } |
---|
640 | 632 | |
---|
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) { |
---|
642 | 634 | if (dev->rd_mode != rd_mode && dev->br_dev.en) { |
---|
643 | 635 | tmp = dev->isp_sdev.in_crop.height; |
---|
644 | 636 | val = rkisp_read(dev, CIF_DUAL_CROP_CTRL, false); |
---|
.. | .. |
---|
659 | 651 | } |
---|
660 | 652 | dev->rd_mode = rd_mode; |
---|
661 | 653 | |
---|
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) { |
---|
668 | 663 | /* multi sensor need to reset isp resize mode if scale up */ |
---|
669 | 664 | val = 0; |
---|
670 | 665 | if (rkisp_read(dev, ISP3X_MAIN_RESIZE_CTRL, true) & 0xf0) |
---|
.. | .. |
---|
700 | 695 | } else { |
---|
701 | 696 | if (dev->isp_ver == ISP_V32_L) |
---|
702 | 697 | 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); |
---|
704 | 699 | } |
---|
705 | 700 | /* sensor mode & index */ |
---|
706 | 701 | if (dev->isp_ver >= ISP_V21) { |
---|
.. | .. |
---|
711 | 706 | else |
---|
712 | 707 | val |= ISP21_SENSOR_MODE(dev->multi_mode); |
---|
713 | 708 | writel(val, hw->base_addr + ISP_ACQ_H_OFFS); |
---|
714 | | - if (hw->is_unite) |
---|
| 709 | + if (hw->unite == ISP_UNITE_TWO) |
---|
715 | 710 | writel(val, hw->base_next_addr + ISP_ACQ_H_OFFS); |
---|
716 | 711 | v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, |
---|
717 | 712 | "sensor mode:%d index:%d | 0x%x\n", |
---|
.. | .. |
---|
731 | 726 | else |
---|
732 | 727 | dev->rdbk_cnt_x1++; |
---|
733 | 728 | 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; |
---|
737 | 731 | |
---|
738 | 732 | 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 */ |
---|
747 | 739 | 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; |
---|
749 | 794 | } |
---|
750 | 795 | } |
---|
751 | 796 | |
---|
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 | + */ |
---|
753 | 800 | if (hw->is_single && is_upd && |
---|
754 | 801 | 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); |
---|
756 | 803 | is_3dlut_upd = true; |
---|
757 | 804 | } |
---|
758 | 805 | if (is_upd) { |
---|
759 | 806 | val = rkisp_read(dev, ISP_CTRL, false); |
---|
760 | 807 | 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); |
---|
762 | 809 | /* 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); |
---|
764 | 811 | /* fix ldch multi sensor case: |
---|
765 | 812 | * ldch will pre-read data when en and isp force upd or frame end, |
---|
766 | 813 | * udelay for ldch pre-read data. |
---|
.. | .. |
---|
771 | 818 | udelay(50); |
---|
772 | 819 | val &= ~(BIT(0) | BIT(31)); |
---|
773 | 820 | writel(val, hw->base_addr + ISP_LDCH_BASE); |
---|
774 | | - if (hw->is_unite) |
---|
| 821 | + if (hw->unite == ISP_UNITE_TWO) |
---|
775 | 822 | writel(val, hw->base_next_addr + ISP_LDCH_BASE); |
---|
776 | 823 | } |
---|
777 | 824 | } |
---|
778 | 825 | 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); |
---|
780 | 827 | |
---|
781 | 828 | /* if output stream enable, wait it end */ |
---|
782 | 829 | val = rkisp_read(dev, CIF_MI_CTRL_SHD, true); |
---|
.. | .. |
---|
807 | 854 | val &= ~SW_IBUF_OP_MODE(0xf); |
---|
808 | 855 | tmp = SW_IBUF_OP_MODE(dev->rd_mode); |
---|
809 | 856 | val |= tmp | SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm); |
---|
| 857 | + if (dev->isp_ver > ISP_V20) |
---|
| 858 | + dma2frm = dev->sw_rd_cnt; |
---|
810 | 859 | 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); |
---|
813 | 862 | 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); |
---|
815 | 864 | } |
---|
816 | 865 | |
---|
817 | 866 | static void rkisp_fast_switch_rx_buf(struct rkisp_device *dev, bool is_current) |
---|
.. | .. |
---|
865 | 914 | isp = dev; |
---|
866 | 915 | is_try = true; |
---|
867 | 916 | 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 | + } |
---|
868 | 923 | goto end; |
---|
869 | 924 | } |
---|
870 | 925 | hw->is_idle = true; |
---|
.. | .. |
---|
914 | 969 | times = t.times; |
---|
915 | 970 | hw->cur_dev_id = id; |
---|
916 | 971 | hw->is_idle = false; |
---|
| 972 | + /* this frame will read count by isp */ |
---|
917 | 973 | 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; |
---|
919 | 982 | isp->sw_rd_cnt = 1; |
---|
920 | 983 | times = 0; |
---|
921 | 984 | } |
---|
| 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 | + */ |
---|
922 | 996 | if (isp->is_pre_on && t.frame_id == 0) { |
---|
923 | 997 | isp->is_first_double = true; |
---|
924 | 998 | 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 | + } |
---|
926 | 1003 | rkisp_fast_switch_rx_buf(isp, false); |
---|
927 | 1004 | } |
---|
| 1005 | + isp->params_vdev.rdbk_times = isp->sw_rd_cnt + 1; |
---|
928 | 1006 | } |
---|
929 | 1007 | end: |
---|
930 | 1008 | spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags); |
---|
.. | .. |
---|
982 | 1060 | { |
---|
983 | 1061 | u32 val = 0; |
---|
984 | 1062 | |
---|
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 | | - |
---|
991 | 1063 | dev->irq_ends |= (irq & dev->irq_ends_mask); |
---|
992 | 1064 | v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, |
---|
993 | 1065 | "%s irq:0x%x ends:0x%x mask:0x%x\n", |
---|
.. | .. |
---|
1001 | 1073 | if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask || |
---|
1002 | 1074 | !IS_HDR_RDBK(dev->rd_mode)) |
---|
1003 | 1075 | return; |
---|
| 1076 | + |
---|
| 1077 | + if (dev->sw_rd_cnt) |
---|
| 1078 | + goto end; |
---|
1004 | 1079 | |
---|
1005 | 1080 | if (dev->is_first_double) { |
---|
1006 | 1081 | rkisp_fast_switch_rx_buf(dev, true); |
---|
.. | .. |
---|
1068 | 1143 | { |
---|
1069 | 1144 | struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop; |
---|
1070 | 1145 | u32 width = out_crop->width, mult = 1; |
---|
1071 | | - bool is_unite = dev->hw_dev->is_unite; |
---|
| 1146 | + u32 unite = dev->hw_dev->unite; |
---|
1072 | 1147 | |
---|
1073 | 1148 | /* isp2.0 no ism */ |
---|
1074 | 1149 | if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21 || |
---|
1075 | 1150 | dev->isp_ver == ISP_V32_L) |
---|
1076 | 1151 | return; |
---|
1077 | 1152 | |
---|
1078 | | - if (is_unite) |
---|
| 1153 | + if (unite) |
---|
1079 | 1154 | 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); |
---|
1087 | 1162 | if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) |
---|
1088 | 1163 | 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); |
---|
1091 | 1165 | |
---|
1092 | 1166 | if (dev->isp_ver == ISP_V30 || dev->isp_ver == ISP_V32) |
---|
1093 | 1167 | return; |
---|
.. | .. |
---|
1389 | 1463 | |
---|
1390 | 1464 | for (i = 0; i < 9; i++) |
---|
1391 | 1465 | rkisp_unite_write(dev, CIF_ISP_CC_COEFF_0 + i * 4, |
---|
1392 | | - *(coeff + i), false, dev->hw_dev->is_unite); |
---|
| 1466 | + *(coeff + i), false); |
---|
1393 | 1467 | |
---|
1394 | 1468 | val = rkisp_read_reg_cache(dev, CIF_ISP_CTRL); |
---|
1395 | 1469 | |
---|
1396 | 1470 | if (dev->isp_sdev.quantization == V4L2_QUANTIZATION_FULL_RANGE) |
---|
1397 | 1471 | rkisp_unite_write(dev, CIF_ISP_CTRL, val | |
---|
1398 | 1472 | 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); |
---|
1401 | 1474 | else |
---|
1402 | 1475 | rkisp_unite_write(dev, CIF_ISP_CTRL, val & |
---|
1403 | 1476 | ~(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); |
---|
1406 | 1478 | } |
---|
1407 | 1479 | |
---|
1408 | 1480 | static void rkisp_config_cmsk_single(struct rkisp_device *dev, |
---|
.. | .. |
---|
1601 | 1673 | cfg = dev->cmsk_cfg; |
---|
1602 | 1674 | spin_unlock_irqrestore(&dev->cmsk_lock, lock_flags); |
---|
1603 | 1675 | |
---|
1604 | | - if (!dev->hw_dev->is_unite) |
---|
| 1676 | + if (!dev->hw_dev->unite) |
---|
1605 | 1677 | rkisp_config_cmsk_single(dev, &cfg); |
---|
1606 | 1678 | else |
---|
1607 | 1679 | rkisp_config_cmsk_dual(dev, &cfg); |
---|
.. | .. |
---|
1616 | 1688 | struct ispsd_out_fmt *out_fmt; |
---|
1617 | 1689 | struct v4l2_rect *in_crop; |
---|
1618 | 1690 | struct rkisp_sensor_info *sensor; |
---|
1619 | | - bool is_unite = dev->hw_dev->is_unite; |
---|
| 1691 | + bool is_unite = !!dev->hw_dev->unite; |
---|
1620 | 1692 | u32 isp_ctrl = 0; |
---|
1621 | 1693 | u32 irq_mask = 0; |
---|
1622 | 1694 | u32 signal = 0; |
---|
.. | .. |
---|
1646 | 1718 | in_fmt->mbus_code == MEDIA_BUS_FMT_Y10_1X10 || |
---|
1647 | 1719 | in_fmt->mbus_code == MEDIA_BUS_FMT_Y12_1X12) { |
---|
1648 | 1720 | 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); |
---|
1651 | 1722 | else |
---|
1652 | 1723 | 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); |
---|
1655 | 1726 | } else { |
---|
1656 | 1727 | if (dev->isp_ver >= ISP_V20) |
---|
1657 | 1728 | rkisp_unite_write(dev, ISP_DEBAYER_CONTROL, |
---|
1658 | 1729 | SW_DEBAYER_EN | |
---|
1659 | 1730 | SW_DEBAYER_FILTER_G_EN | |
---|
1660 | | - SW_DEBAYER_FILTER_C_EN, |
---|
1661 | | - false, is_unite); |
---|
| 1731 | + SW_DEBAYER_FILTER_C_EN, false); |
---|
1662 | 1732 | else |
---|
1663 | 1733 | rkisp_write(dev, CIF_ISP_DEMOSAIC, |
---|
1664 | | - CIF_ISP_DEMOSAIC_TH(0xc), false); |
---|
| 1734 | + CIF_ISP_DEMOSAIC_TH(0xc), false); |
---|
1665 | 1735 | } |
---|
1666 | 1736 | |
---|
1667 | 1737 | if (sensor && sensor->mbus.type == V4L2_MBUS_BT656) |
---|
.. | .. |
---|
1714 | 1784 | if (rkisp_read_reg_cache(dev, CIF_ISP_CTRL) & ISP32_MIR_ENABLE) |
---|
1715 | 1785 | isp_ctrl |= ISP32_MIR_ENABLE; |
---|
1716 | 1786 | |
---|
1717 | | - rkisp_unite_write(dev, CIF_ISP_CTRL, isp_ctrl, false, is_unite); |
---|
| 1787 | + rkisp_unite_write(dev, CIF_ISP_CTRL, isp_ctrl, false); |
---|
1718 | 1788 | acq_prop |= signal | in_fmt->yuv_seq | |
---|
1719 | 1789 | CIF_ISP_ACQ_PROP_BAYER_PAT(in_fmt->bayer_pat) | |
---|
1720 | 1790 | 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); |
---|
1723 | 1793 | |
---|
1724 | 1794 | if (is_unite) |
---|
1725 | 1795 | width = width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; |
---|
1726 | 1796 | /* 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); |
---|
1733 | 1800 | |
---|
1734 | 1801 | /* 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); |
---|
1738 | 1805 | |
---|
1739 | 1806 | 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); |
---|
1744 | 1809 | } 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); |
---|
1749 | 1812 | } |
---|
1750 | 1813 | |
---|
1751 | 1814 | /* interrupt mask */ |
---|
.. | .. |
---|
1754 | 1817 | irq_mask |= ISP2X_LSC_LUT_ERR; |
---|
1755 | 1818 | if (dev->is_pre_on) |
---|
1756 | 1819 | 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); |
---|
1758 | 1821 | |
---|
1759 | 1822 | if ((dev->isp_ver == ISP_V20 || |
---|
1760 | 1823 | dev->isp_ver == ISP_V21) && |
---|
.. | .. |
---|
1909 | 1972 | if (dev->isp_ver == ISP_V32) |
---|
1910 | 1973 | dpcl |= BIT(0); |
---|
1911 | 1974 | |
---|
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); |
---|
1914 | 1976 | return ret; |
---|
1915 | 1977 | } |
---|
1916 | 1978 | |
---|
.. | .. |
---|
2007 | 2069 | |
---|
2008 | 2070 | v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, |
---|
2009 | 2071 | "%s refcnt:%d\n", __func__, |
---|
2010 | | - atomic_read(&dev->hw_dev->refcnt)); |
---|
| 2072 | + atomic_read(&hw->refcnt)); |
---|
2011 | 2073 | |
---|
2012 | | - if (atomic_read(&dev->hw_dev->refcnt) > 1) |
---|
| 2074 | + if (atomic_read(&hw->refcnt) > 1) |
---|
2013 | 2075 | goto end; |
---|
2014 | 2076 | /* |
---|
2015 | 2077 | * ISP(mi) stop in mi frame end -> Stop ISP(mipi) -> |
---|
.. | .. |
---|
2065 | 2127 | |
---|
2066 | 2128 | val = readl(base + CIF_ISP_CTRL); |
---|
2067 | 2129 | writel(val | CIF_ISP_CTRL_ISP_CFG_UPD, base + CIF_ISP_CTRL); |
---|
2068 | | - if (hw->is_unite) |
---|
| 2130 | + if (hw->unite == ISP_UNITE_TWO) |
---|
2069 | 2131 | rkisp_next_write(dev, CIF_ISP_CTRL, |
---|
2070 | 2132 | val | CIF_ISP_CTRL_ISP_CFG_UPD, true); |
---|
2071 | 2133 | |
---|
.. | .. |
---|
2082 | 2144 | safe_rate = hw->clk_rate_tbl[0].clk_rate * 1000000UL; |
---|
2083 | 2145 | if (old_rate > safe_rate) { |
---|
2084 | 2146 | rkisp_set_clk_rate(hw->clks[0], safe_rate); |
---|
2085 | | - if (hw->is_unite) |
---|
| 2147 | + if (hw->unite == ISP_UNITE_TWO) |
---|
2086 | 2148 | rkisp_set_clk_rate(hw->clks[5], safe_rate); |
---|
2087 | 2149 | udelay(100); |
---|
2088 | 2150 | } |
---|
2089 | | - rkisp_soft_reset(dev->hw_dev, false); |
---|
| 2151 | + rkisp_soft_reset(hw, false); |
---|
2090 | 2152 | } |
---|
2091 | 2153 | |
---|
2092 | 2154 | if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) { |
---|
.. | .. |
---|
2097 | 2159 | writel(0, base + CIF_ISP_CSI0_MASK3); |
---|
2098 | 2160 | } else if (dev->isp_ver >= ISP_V20) { |
---|
2099 | 2161 | writel(0, base + CSI2RX_CSI2_RESETN); |
---|
2100 | | - if (hw->is_unite) |
---|
| 2162 | + if (hw->unite == ISP_UNITE_TWO) |
---|
2101 | 2163 | rkisp_next_write(dev, CSI2RX_CSI2_RESETN, 0, true); |
---|
2102 | 2164 | } |
---|
2103 | 2165 | |
---|
2104 | 2166 | hw->is_dvfs = false; |
---|
2105 | 2167 | 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; |
---|
2108 | 2171 | end: |
---|
2109 | 2172 | dev->irq_ends_mask = 0; |
---|
2110 | 2173 | dev->hdr.op_mode = 0; |
---|
2111 | 2174 | dev->sw_rd_cnt = 0; |
---|
| 2175 | + dev->stats_vdev.rdbk_drop = false; |
---|
2112 | 2176 | rkisp_set_state(&dev->isp_state, ISP_STOP); |
---|
2113 | 2177 | |
---|
2114 | 2178 | if (dev->isp_ver >= ISP_V20) |
---|
.. | .. |
---|
2154 | 2218 | val = dev->isp_sdev.out_crop.height / 15; |
---|
2155 | 2219 | val = dev->cap_dev.wait_line / val; |
---|
2156 | 2220 | 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); |
---|
2163 | 2224 | dev->rawaf_irq_cnt = 0; |
---|
2164 | 2225 | } |
---|
2165 | 2226 | } |
---|
.. | .. |
---|
2187 | 2248 | val |= NOC_HURRY_PRIORITY(2) | NOC_HURRY_W_MODE(2) | NOC_HURRY_R_MODE(1); |
---|
2188 | 2249 | if (atomic_read(&dev->hw_dev->refcnt) > 1) |
---|
2189 | 2250 | 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); |
---|
2191 | 2252 | rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD); |
---|
2192 | 2253 | |
---|
2193 | 2254 | dev->isp_err_cnt = 0; |
---|
2194 | 2255 | dev->isp_isr_cnt = 0; |
---|
2195 | | - dev->isp_state = ISP_START | ISP_FRAME_END; |
---|
2196 | 2256 | dev->irq_ends_mask |= ISP_FRAME_END; |
---|
2197 | 2257 | dev->irq_ends = 0; |
---|
2198 | 2258 | |
---|
.. | .. |
---|
2668 | 2728 | max_h = CIF_ISP_INPUT_H_MAX_V21; |
---|
2669 | 2729 | break; |
---|
2670 | 2730 | case ISP_V30: |
---|
2671 | | - max_w = dev->hw_dev->is_unite ? |
---|
| 2731 | + max_w = dev->hw_dev->unite ? |
---|
2672 | 2732 | 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 ? |
---|
2674 | 2734 | CIF_ISP_INPUT_H_MAX_V30_UNITE : CIF_ISP_INPUT_H_MAX_V30; |
---|
2675 | 2735 | break; |
---|
2676 | 2736 | 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; |
---|
2679 | 2741 | break; |
---|
2680 | 2742 | case ISP_V32_L: |
---|
2681 | 2743 | max_w = CIF_ISP_INPUT_W_MAX_V32_L; |
---|
.. | .. |
---|
2901 | 2963 | rkisp_config_cif(isp_dev); |
---|
2902 | 2964 | rkisp_isp_start(isp_dev); |
---|
2903 | 2965 | rkisp_global_update_mi(isp_dev); |
---|
| 2966 | + isp_dev->isp_state = ISP_START | ISP_FRAME_END; |
---|
2904 | 2967 | rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, NULL); |
---|
2905 | 2968 | return 0; |
---|
2906 | 2969 | } |
---|
.. | .. |
---|
2936 | 2999 | u32 val = pool->buf.buff_addr[RKISP_PLANE_Y]; |
---|
2937 | 3000 | |
---|
2938 | 3001 | 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) { |
---|
2940 | 3003 | u32 offs = stream->out_fmt.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL; |
---|
2941 | 3004 | |
---|
2942 | 3005 | if (stream->memory) |
---|
.. | .. |
---|
3412 | 3475 | if (dev->is_bigmode) |
---|
3413 | 3476 | mode |= RKISP_ISP_BIGMODE; |
---|
3414 | 3477 | info->mode = mode; |
---|
3415 | | - if (dev->hw_dev->is_unite) |
---|
| 3478 | + if (dev->hw_dev->unite) |
---|
3416 | 3479 | info->act_width = in_crop->width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; |
---|
3417 | 3480 | else |
---|
3418 | 3481 | info->act_width = in_crop->width; |
---|
.. | .. |
---|
3699 | 3762 | struct ispsd_in_fmt *in_fmt = &isp_sd->in_fmt; |
---|
3700 | 3763 | struct ispsd_out_fmt *out_fmt = &isp_sd->out_fmt; |
---|
3701 | 3764 | |
---|
3702 | | - *in_fmt = rkisp_isp_input_formats[0]; |
---|
| 3765 | + *in_fmt = rkisp_isp_input_formats[8]; |
---|
3703 | 3766 | in_frm->width = RKISP_DEFAULT_WIDTH; |
---|
3704 | 3767 | in_frm->height = RKISP_DEFAULT_HEIGHT; |
---|
3705 | 3768 | in_frm->code = in_fmt->mbus_code; |
---|
.. | .. |
---|
3805 | 3868 | }) |
---|
3806 | 3869 | |
---|
3807 | 3870 | #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 | + |
---|
3808 | 3914 | void rkisp_chk_tb_over(struct rkisp_device *isp_dev) |
---|
3809 | 3915 | { |
---|
| 3916 | + struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev; |
---|
3810 | 3917 | struct rkisp_hw_dev *hw = isp_dev->hw_dev; |
---|
3811 | 3918 | struct rkisp_thunderboot_resmem_head *head; |
---|
3812 | 3919 | enum rkisp_tb_state tb_state; |
---|
.. | .. |
---|
3815 | 3922 | if (!isp_dev->is_thunderboot) |
---|
3816 | 3923 | return; |
---|
3817 | 3924 | |
---|
| 3925 | + if (isp_dev->isp_ver == ISP_V32 && params_vdev->is_first_cfg) |
---|
| 3926 | + goto end; |
---|
| 3927 | + |
---|
3818 | 3928 | resmem_va = phys_to_virt(isp_dev->resmem_pa); |
---|
3819 | 3929 | head = (struct rkisp_thunderboot_resmem_head *)resmem_va; |
---|
3820 | 3930 | dma_sync_single_for_cpu(isp_dev->dev, isp_dev->resmem_addr, |
---|
3821 | 3931 | sizeof(struct rkisp_thunderboot_resmem_head), |
---|
3822 | 3932 | DMA_FROM_DEVICE); |
---|
3823 | 3933 | |
---|
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); |
---|
3825 | 3935 | if (head->complete != RKISP_TB_OK) { |
---|
3826 | 3936 | v4l2_err(&isp_dev->v4l2_dev, "wait thunderboot over timeout\n"); |
---|
3827 | 3937 | } 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; |
---|
3831 | 3939 | |
---|
3832 | 3940 | /* wait for all isp dev to register */ |
---|
3833 | 3941 | if (head->camera_num > 1) { |
---|
.. | .. |
---|
3837 | 3945 | break; |
---|
3838 | 3946 | usleep_range(200, 210); |
---|
3839 | 3947 | } |
---|
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; |
---|
3865 | 3953 | } |
---|
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; |
---|
3873 | 3954 | } |
---|
| 3955 | + for (i = 0; i < head->camera_num; i++) |
---|
| 3956 | + rkisp_save_tb_info(hw->isp[i]); |
---|
3874 | 3957 | } |
---|
3875 | | - memcpy(&isp_dev->tb_head, head, sizeof(*head)); |
---|
| 3958 | +end: |
---|
| 3959 | + head = &isp_dev->tb_head; |
---|
3876 | 3960 | v4l2_info(&isp_dev->v4l2_dev, |
---|
3877 | 3961 | "thunderboot info: %d, %d, %d, %d, %d, %d | %d %d\n", |
---|
3878 | 3962 | head->enable, |
---|
.. | .. |
---|
4005 | 4089 | struct rkisp_device *dev) |
---|
4006 | 4090 | { |
---|
4007 | 4091 | struct rkisp_hw_dev *hw = dev->hw_dev; |
---|
4008 | | - void __iomem *base = !hw->is_unite ? |
---|
| 4092 | + void __iomem *base = hw->unite != ISP_UNITE_TWO ? |
---|
4009 | 4093 | hw->base_addr : hw->base_next_addr; |
---|
4010 | 4094 | unsigned int isp_mis_tmp = 0; |
---|
4011 | 4095 | unsigned int isp_err = 0; |
---|
.. | .. |
---|
4026 | 4110 | if (isp3a_mis & ISP2X_3A_RAWAE_BIG && dev->params_vdev.rdbk_times > 0) |
---|
4027 | 4111 | writel(BIT(31), base + RAWAE_BIG1_BASE + RAWAE_BIG_CTRL); |
---|
4028 | 4112 | |
---|
4029 | | - if (hw->is_unite) { |
---|
| 4113 | + if (hw->unite == ISP_UNITE_TWO) { |
---|
4030 | 4114 | u32 val = rkisp_read(dev, ISP3X_ISP_RIS, true); |
---|
4031 | 4115 | |
---|
4032 | 4116 | if (val) { |
---|
.. | .. |
---|
4057 | 4141 | } |
---|
4058 | 4142 | |
---|
4059 | 4143 | 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 | + } |
---|
4063 | 4152 | rkisp_stats_rdbk_enable(&dev->stats_vdev, true); |
---|
4064 | 4153 | goto vs_skip; |
---|
4065 | 4154 | } |
---|