hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/media/platform/rockchip/isp/hw.c
....@@ -132,7 +132,7 @@
132132 for (i = 0; i < size; i++) {
133133 flag = dev->sw_base_addr + reg[i] + RKISP_ISP_SW_REG_SIZE;
134134 *flag = SW_REG_CACHE;
135
- if (dev->hw_dev->is_unite) {
135
+ if (dev->hw_dev->unite) {
136136 flag += RKISP_ISP_SW_MAX_SIZE / 4;
137137 *flag = SW_REG_CACHE;
138138 }
....@@ -144,7 +144,7 @@
144144 struct device *dev = ctx;
145145 struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev);
146146 struct rkisp_device *isp = hw_dev->isp[hw_dev->mipi_dev_id];
147
- void __iomem *base = !hw_dev->is_unite ?
147
+ void __iomem *base = hw_dev->unite != ISP_UNITE_TWO ?
148148 hw_dev->base_addr : hw_dev->base_next_addr;
149149 ktime_t t = 0;
150150 s64 us;
....@@ -201,7 +201,7 @@
201201 struct device *dev = ctx;
202202 struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev);
203203 struct rkisp_device *isp = hw_dev->isp[hw_dev->cur_dev_id];
204
- void __iomem *base = !hw_dev->is_unite ?
204
+ void __iomem *base = hw_dev->unite != ISP_UNITE_TWO ?
205205 hw_dev->base_addr : hw_dev->base_next_addr;
206206 u32 mis_val, tx_isr = MI_RAW0_WR_FRAME | MI_RAW1_WR_FRAME |
207207 MI_RAW2_WR_FRAME | MI_RAW3_WR_FRAME;
....@@ -237,7 +237,7 @@
237237 struct device *dev = ctx;
238238 struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev);
239239 struct rkisp_device *isp = hw_dev->isp[hw_dev->cur_dev_id];
240
- void __iomem *base = !hw_dev->is_unite ?
240
+ void __iomem *base = hw_dev->unite != ISP_UNITE_TWO ?
241241 hw_dev->base_addr : hw_dev->base_next_addr;
242242 unsigned int mis_val, mis_3a = 0;
243243 ktime_t t = 0;
....@@ -455,6 +455,9 @@
455455 }, {
456456 .clk_rate = 350,
457457 .refer_data = 3072,
458
+ }, {
459
+ .clk_rate = 440,
460
+ .refer_data = 3840,
458461 }
459462 };
460463
....@@ -636,7 +639,7 @@
636639 /* record clk config and recover */
637640 iccl0 = readl(base + CIF_ICCL);
638641 clk_ctrl0 = readl(base + CTRL_VI_ISP_CLK_CTRL);
639
- if (dev->is_unite) {
642
+ if (dev->unite == ISP_UNITE_TWO) {
640643 iccl1 = readl(dev->base_next_addr + CIF_ICCL);
641644 clk_ctrl1 = readl(dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL);
642645 }
....@@ -646,7 +649,7 @@
646649 * isp soft reset first to protect isp reset.
647650 */
648651 writel(0xffff, base + CIF_IRCL);
649
- if (dev->is_unite)
652
+ if (dev->unite == ISP_UNITE_TWO)
650653 writel(0xffff, dev->base_next_addr + CIF_IRCL);
651654 udelay(10);
652655 }
....@@ -669,7 +672,7 @@
669672 writel(val, base + CIF_IRCL);
670673 if (dev->isp_ver == ISP_V32)
671674 rv1106_sdmmc_put_lock();
672
- if (dev->is_unite)
675
+ if (dev->unite == ISP_UNITE_TWO)
673676 writel(0xffff, dev->base_next_addr + CIF_IRCL);
674677 udelay(10);
675678
....@@ -681,7 +684,7 @@
681684
682685 writel(iccl0, base + CIF_ICCL);
683686 writel(clk_ctrl0, base + CTRL_VI_ISP_CLK_CTRL);
684
- if (dev->is_unite) {
687
+ if (dev->unite == ISP_UNITE_TWO) {
685688 writel(iccl1, dev->base_next_addr + CIF_ICCL);
686689 writel(clk_ctrl1, dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL);
687690 }
....@@ -722,7 +725,7 @@
722725 writel(val, dev->base_addr + CIF_ICCL);
723726 if (dev->isp_ver == ISP_V32)
724727 rv1106_sdmmc_put_lock();
725
- if (dev->is_unite)
728
+ if (dev->unite == ISP_UNITE_TWO)
726729 writel(val, dev->base_next_addr + CIF_ICCL);
727730
728731 if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) {
....@@ -752,7 +755,7 @@
752755 writel(val, dev->base_addr + CTRL_VI_ISP_CLK_CTRL);
753756 if (dev->isp_ver == ISP_V32)
754757 rv1106_sdmmc_put_lock();
755
- if (dev->is_unite)
758
+ if (dev->unite == ISP_UNITE_TWO)
756759 writel(val, dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL);
757760 }
758761 }
....@@ -786,10 +789,12 @@
786789 }
787790 }
788791
789
- rate = dev->clk_rate_tbl[0].clk_rate * 1000000UL;
790
- rkisp_set_clk_rate(dev->clks[0], rate);
791
- if (dev->is_unite)
792
- rkisp_set_clk_rate(dev->clks[5], rate);
792
+ if (!dev->is_assigned_clk) {
793
+ rate = dev->clk_rate_tbl[0].clk_rate * 1000000UL;
794
+ rkisp_set_clk_rate(dev->clks[0], rate);
795
+ if (dev->unite == ISP_UNITE_TWO)
796
+ rkisp_set_clk_rate(dev->clks[5], rate);
797
+ }
793798 rkisp_soft_reset(dev, false);
794799 isp_config_clk(dev, true);
795800 return 0;
....@@ -848,6 +853,7 @@
848853 struct resource *res;
849854 int i, ret;
850855 bool is_mem_reserved = true;
856
+ u32 clk_rate = 0;
851857
852858 match = of_match_node(rkisp_hw_of_match, node);
853859 if (IS_ERR(match))
....@@ -858,21 +864,11 @@
858864 return -ENOMEM;
859865
860866 match_data = match->data;
861
- hw_dev->is_unite = match_data->unite;
862867 dev_set_drvdata(dev, hw_dev);
863868 hw_dev->dev = dev;
864869 hw_dev->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP);
865870 dev_info(dev, "is_thunderboot: %d\n", hw_dev->is_thunderboot);
866
- memset(&hw_dev->max_in, 0, sizeof(hw_dev->max_in));
867
- if (!of_property_read_u32_array(node, "max-input", &hw_dev->max_in.w, 3)) {
868
- hw_dev->max_in.is_fix = true;
869
- if (hw_dev->is_unite) {
870
- hw_dev->max_in.w /= 2;
871
- hw_dev->max_in.w += RKMOUDLE_UNITE_EXTEND_PIXEL;
872
- }
873
- }
874
- dev_info(dev, "max input:%dx%d@%dfps\n",
875
- hw_dev->max_in.w, hw_dev->max_in.h, hw_dev->max_in.fps);
871
+
876872 hw_dev->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
877873 if (IS_ERR(hw_dev->grf))
878874 dev_warn(dev, "Missing rockchip,grf property\n");
....@@ -919,6 +915,27 @@
919915 }
920916 }
921917
918
+ hw_dev->isp_ver = match_data->isp_ver;
919
+ if (match_data->unite) {
920
+ hw_dev->unite = ISP_UNITE_TWO;
921
+ } else if (device_property_read_bool(dev, "rockchip,unite-en")) {
922
+ hw_dev->unite = ISP_UNITE_ONE;
923
+ hw_dev->base_next_addr = hw_dev->base_addr;
924
+ } else {
925
+ hw_dev->unite = ISP_UNITE_NONE;
926
+ }
927
+
928
+ memset(&hw_dev->max_in, 0, sizeof(hw_dev->max_in));
929
+ if (!of_property_read_u32_array(node, "max-input", &hw_dev->max_in.w, 3)) {
930
+ hw_dev->max_in.is_fix = true;
931
+ if (hw_dev->unite) {
932
+ hw_dev->max_in.w /= 2;
933
+ hw_dev->max_in.w += RKMOUDLE_UNITE_EXTEND_PIXEL;
934
+ }
935
+ }
936
+ dev_info(dev, "max input:%dx%d@%dfps\n",
937
+ hw_dev->max_in.w, hw_dev->max_in.h, hw_dev->max_in.fps);
938
+
922939 rkisp_monitor = device_property_read_bool(dev, "rockchip,restart-monitor-en");
923940 hw_dev->mipi_irq = -1;
924941
....@@ -941,6 +958,11 @@
941958 hw_dev->clk_rate_tbl = match_data->clk_rate_tbl;
942959 hw_dev->num_clk_rate_tbl = match_data->num_clk_rate_tbl;
943960
961
+ hw_dev->is_assigned_clk = false;
962
+ ret = of_property_read_u32(node, "assigned-clock-rates", &clk_rate);
963
+ if (!ret && clk_rate)
964
+ hw_dev->is_assigned_clk = true;
965
+
944966 hw_dev->reset = devm_reset_control_array_get(dev, false, false);
945967 if (IS_ERR(hw_dev->reset)) {
946968 dev_dbg(dev, "failed to get reset\n");
....@@ -959,10 +981,8 @@
959981 hw_dev->dev_link_num = 0;
960982 hw_dev->cur_dev_id = 0;
961983 hw_dev->mipi_dev_id = 0;
962
- hw_dev->pre_dev_id = 0;
984
+ hw_dev->pre_dev_id = -1;
963985 hw_dev->is_multi_overflow = false;
964
- hw_dev->isp_ver = match_data->isp_ver;
965
- hw_dev->is_unite = match_data->unite;
966986 mutex_init(&hw_dev->dev_lock);
967987 spin_lock_init(&hw_dev->rdbk_lock);
968988 atomic_set(&hw_dev->refcnt, 0);
....@@ -1012,7 +1032,7 @@
10121032 hw_dev->is_shutdown = true;
10131033 if (pm_runtime_active(&pdev->dev)) {
10141034 writel(0xffff, hw_dev->base_addr + CIF_IRCL);
1015
- if (hw_dev->is_unite)
1035
+ if (hw_dev->unite == ISP_UNITE_TWO)
10161036 writel(0xffff, hw_dev->base_next_addr + CIF_IRCL);
10171037 }
10181038 dev_info(&pdev->dev, "%s\n", __func__);
....@@ -1052,7 +1072,7 @@
10521072 hw_dev->is_single = false;
10531073 w = isp->isp_sdev.in_crop.width;
10541074 h = isp->isp_sdev.in_crop.height;
1055
- if (hw_dev->is_unite)
1075
+ if (hw_dev->unite)
10561076 w = w / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
10571077 hw_dev->isp_size[i].w = w;
10581078 hw_dev->isp_size[i].h = h;
....@@ -1064,6 +1084,8 @@
10641084 hw_dev->max_in.h = h;
10651085 }
10661086 }
1087
+ if (hw_dev->unite == ISP_UNITE_ONE)
1088
+ hw_dev->is_single = false;
10671089 for (i = 0; i < hw_dev->dev_num; i++) {
10681090 isp = hw_dev->isp[i];
10691091 if (!isp || (isp && !isp->is_hw_link))
....@@ -1077,7 +1099,7 @@
10771099 struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev);
10781100 void __iomem *base = hw_dev->base_addr;
10791101 struct rkisp_device *isp;
1080
- int mult = hw_dev->is_unite ? 2 : 1;
1102
+ int mult = hw_dev->unite ? 2 : 1;
10811103 int ret, i;
10821104 void *buf;
10831105
....@@ -1093,7 +1115,7 @@
10931115 buf = isp->sw_base_addr;
10941116 memset(buf, 0, RKISP_ISP_SW_MAX_SIZE * mult);
10951117 memcpy_fromio(buf, base, RKISP_ISP_SW_REG_SIZE);
1096
- if (hw_dev->is_unite) {
1118
+ if (hw_dev->unite) {
10971119 buf += RKISP_ISP_SW_MAX_SIZE;
10981120 base = hw_dev->base_next_addr;
10991121 memcpy_fromio(buf, base, RKISP_ISP_SW_REG_SIZE);