| .. | .. |
|---|
| 132 | 132 | for (i = 0; i < size; i++) { |
|---|
| 133 | 133 | flag = dev->sw_base_addr + reg[i] + RKISP_ISP_SW_REG_SIZE; |
|---|
| 134 | 134 | *flag = SW_REG_CACHE; |
|---|
| 135 | | - if (dev->hw_dev->is_unite) { |
|---|
| 135 | + if (dev->hw_dev->unite) { |
|---|
| 136 | 136 | flag += RKISP_ISP_SW_MAX_SIZE / 4; |
|---|
| 137 | 137 | *flag = SW_REG_CACHE; |
|---|
| 138 | 138 | } |
|---|
| .. | .. |
|---|
| 144 | 144 | struct device *dev = ctx; |
|---|
| 145 | 145 | struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); |
|---|
| 146 | 146 | 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 ? |
|---|
| 148 | 148 | hw_dev->base_addr : hw_dev->base_next_addr; |
|---|
| 149 | 149 | ktime_t t = 0; |
|---|
| 150 | 150 | s64 us; |
|---|
| .. | .. |
|---|
| 201 | 201 | struct device *dev = ctx; |
|---|
| 202 | 202 | struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); |
|---|
| 203 | 203 | 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 ? |
|---|
| 205 | 205 | hw_dev->base_addr : hw_dev->base_next_addr; |
|---|
| 206 | 206 | u32 mis_val, tx_isr = MI_RAW0_WR_FRAME | MI_RAW1_WR_FRAME | |
|---|
| 207 | 207 | MI_RAW2_WR_FRAME | MI_RAW3_WR_FRAME; |
|---|
| .. | .. |
|---|
| 237 | 237 | struct device *dev = ctx; |
|---|
| 238 | 238 | struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); |
|---|
| 239 | 239 | 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 ? |
|---|
| 241 | 241 | hw_dev->base_addr : hw_dev->base_next_addr; |
|---|
| 242 | 242 | unsigned int mis_val, mis_3a = 0; |
|---|
| 243 | 243 | ktime_t t = 0; |
|---|
| .. | .. |
|---|
| 455 | 455 | }, { |
|---|
| 456 | 456 | .clk_rate = 350, |
|---|
| 457 | 457 | .refer_data = 3072, |
|---|
| 458 | + }, { |
|---|
| 459 | + .clk_rate = 440, |
|---|
| 460 | + .refer_data = 3840, |
|---|
| 458 | 461 | } |
|---|
| 459 | 462 | }; |
|---|
| 460 | 463 | |
|---|
| .. | .. |
|---|
| 636 | 639 | /* record clk config and recover */ |
|---|
| 637 | 640 | iccl0 = readl(base + CIF_ICCL); |
|---|
| 638 | 641 | clk_ctrl0 = readl(base + CTRL_VI_ISP_CLK_CTRL); |
|---|
| 639 | | - if (dev->is_unite) { |
|---|
| 642 | + if (dev->unite == ISP_UNITE_TWO) { |
|---|
| 640 | 643 | iccl1 = readl(dev->base_next_addr + CIF_ICCL); |
|---|
| 641 | 644 | clk_ctrl1 = readl(dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL); |
|---|
| 642 | 645 | } |
|---|
| .. | .. |
|---|
| 646 | 649 | * isp soft reset first to protect isp reset. |
|---|
| 647 | 650 | */ |
|---|
| 648 | 651 | writel(0xffff, base + CIF_IRCL); |
|---|
| 649 | | - if (dev->is_unite) |
|---|
| 652 | + if (dev->unite == ISP_UNITE_TWO) |
|---|
| 650 | 653 | writel(0xffff, dev->base_next_addr + CIF_IRCL); |
|---|
| 651 | 654 | udelay(10); |
|---|
| 652 | 655 | } |
|---|
| .. | .. |
|---|
| 669 | 672 | writel(val, base + CIF_IRCL); |
|---|
| 670 | 673 | if (dev->isp_ver == ISP_V32) |
|---|
| 671 | 674 | rv1106_sdmmc_put_lock(); |
|---|
| 672 | | - if (dev->is_unite) |
|---|
| 675 | + if (dev->unite == ISP_UNITE_TWO) |
|---|
| 673 | 676 | writel(0xffff, dev->base_next_addr + CIF_IRCL); |
|---|
| 674 | 677 | udelay(10); |
|---|
| 675 | 678 | |
|---|
| .. | .. |
|---|
| 681 | 684 | |
|---|
| 682 | 685 | writel(iccl0, base + CIF_ICCL); |
|---|
| 683 | 686 | writel(clk_ctrl0, base + CTRL_VI_ISP_CLK_CTRL); |
|---|
| 684 | | - if (dev->is_unite) { |
|---|
| 687 | + if (dev->unite == ISP_UNITE_TWO) { |
|---|
| 685 | 688 | writel(iccl1, dev->base_next_addr + CIF_ICCL); |
|---|
| 686 | 689 | writel(clk_ctrl1, dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL); |
|---|
| 687 | 690 | } |
|---|
| .. | .. |
|---|
| 722 | 725 | writel(val, dev->base_addr + CIF_ICCL); |
|---|
| 723 | 726 | if (dev->isp_ver == ISP_V32) |
|---|
| 724 | 727 | rv1106_sdmmc_put_lock(); |
|---|
| 725 | | - if (dev->is_unite) |
|---|
| 728 | + if (dev->unite == ISP_UNITE_TWO) |
|---|
| 726 | 729 | writel(val, dev->base_next_addr + CIF_ICCL); |
|---|
| 727 | 730 | |
|---|
| 728 | 731 | if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) { |
|---|
| .. | .. |
|---|
| 752 | 755 | writel(val, dev->base_addr + CTRL_VI_ISP_CLK_CTRL); |
|---|
| 753 | 756 | if (dev->isp_ver == ISP_V32) |
|---|
| 754 | 757 | rv1106_sdmmc_put_lock(); |
|---|
| 755 | | - if (dev->is_unite) |
|---|
| 758 | + if (dev->unite == ISP_UNITE_TWO) |
|---|
| 756 | 759 | writel(val, dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL); |
|---|
| 757 | 760 | } |
|---|
| 758 | 761 | } |
|---|
| .. | .. |
|---|
| 786 | 789 | } |
|---|
| 787 | 790 | } |
|---|
| 788 | 791 | |
|---|
| 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 | + } |
|---|
| 793 | 798 | rkisp_soft_reset(dev, false); |
|---|
| 794 | 799 | isp_config_clk(dev, true); |
|---|
| 795 | 800 | return 0; |
|---|
| .. | .. |
|---|
| 848 | 853 | struct resource *res; |
|---|
| 849 | 854 | int i, ret; |
|---|
| 850 | 855 | bool is_mem_reserved = true; |
|---|
| 856 | + u32 clk_rate = 0; |
|---|
| 851 | 857 | |
|---|
| 852 | 858 | match = of_match_node(rkisp_hw_of_match, node); |
|---|
| 853 | 859 | if (IS_ERR(match)) |
|---|
| .. | .. |
|---|
| 858 | 864 | return -ENOMEM; |
|---|
| 859 | 865 | |
|---|
| 860 | 866 | match_data = match->data; |
|---|
| 861 | | - hw_dev->is_unite = match_data->unite; |
|---|
| 862 | 867 | dev_set_drvdata(dev, hw_dev); |
|---|
| 863 | 868 | hw_dev->dev = dev; |
|---|
| 864 | 869 | hw_dev->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); |
|---|
| 865 | 870 | 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 | + |
|---|
| 876 | 872 | hw_dev->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf"); |
|---|
| 877 | 873 | if (IS_ERR(hw_dev->grf)) |
|---|
| 878 | 874 | dev_warn(dev, "Missing rockchip,grf property\n"); |
|---|
| .. | .. |
|---|
| 919 | 915 | } |
|---|
| 920 | 916 | } |
|---|
| 921 | 917 | |
|---|
| 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 | + |
|---|
| 922 | 939 | rkisp_monitor = device_property_read_bool(dev, "rockchip,restart-monitor-en"); |
|---|
| 923 | 940 | hw_dev->mipi_irq = -1; |
|---|
| 924 | 941 | |
|---|
| .. | .. |
|---|
| 941 | 958 | hw_dev->clk_rate_tbl = match_data->clk_rate_tbl; |
|---|
| 942 | 959 | hw_dev->num_clk_rate_tbl = match_data->num_clk_rate_tbl; |
|---|
| 943 | 960 | |
|---|
| 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 | + |
|---|
| 944 | 966 | hw_dev->reset = devm_reset_control_array_get(dev, false, false); |
|---|
| 945 | 967 | if (IS_ERR(hw_dev->reset)) { |
|---|
| 946 | 968 | dev_dbg(dev, "failed to get reset\n"); |
|---|
| .. | .. |
|---|
| 959 | 981 | hw_dev->dev_link_num = 0; |
|---|
| 960 | 982 | hw_dev->cur_dev_id = 0; |
|---|
| 961 | 983 | hw_dev->mipi_dev_id = 0; |
|---|
| 962 | | - hw_dev->pre_dev_id = 0; |
|---|
| 984 | + hw_dev->pre_dev_id = -1; |
|---|
| 963 | 985 | hw_dev->is_multi_overflow = false; |
|---|
| 964 | | - hw_dev->isp_ver = match_data->isp_ver; |
|---|
| 965 | | - hw_dev->is_unite = match_data->unite; |
|---|
| 966 | 986 | mutex_init(&hw_dev->dev_lock); |
|---|
| 967 | 987 | spin_lock_init(&hw_dev->rdbk_lock); |
|---|
| 968 | 988 | atomic_set(&hw_dev->refcnt, 0); |
|---|
| .. | .. |
|---|
| 1012 | 1032 | hw_dev->is_shutdown = true; |
|---|
| 1013 | 1033 | if (pm_runtime_active(&pdev->dev)) { |
|---|
| 1014 | 1034 | writel(0xffff, hw_dev->base_addr + CIF_IRCL); |
|---|
| 1015 | | - if (hw_dev->is_unite) |
|---|
| 1035 | + if (hw_dev->unite == ISP_UNITE_TWO) |
|---|
| 1016 | 1036 | writel(0xffff, hw_dev->base_next_addr + CIF_IRCL); |
|---|
| 1017 | 1037 | } |
|---|
| 1018 | 1038 | dev_info(&pdev->dev, "%s\n", __func__); |
|---|
| .. | .. |
|---|
| 1052 | 1072 | hw_dev->is_single = false; |
|---|
| 1053 | 1073 | w = isp->isp_sdev.in_crop.width; |
|---|
| 1054 | 1074 | h = isp->isp_sdev.in_crop.height; |
|---|
| 1055 | | - if (hw_dev->is_unite) |
|---|
| 1075 | + if (hw_dev->unite) |
|---|
| 1056 | 1076 | w = w / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; |
|---|
| 1057 | 1077 | hw_dev->isp_size[i].w = w; |
|---|
| 1058 | 1078 | hw_dev->isp_size[i].h = h; |
|---|
| .. | .. |
|---|
| 1064 | 1084 | hw_dev->max_in.h = h; |
|---|
| 1065 | 1085 | } |
|---|
| 1066 | 1086 | } |
|---|
| 1087 | + if (hw_dev->unite == ISP_UNITE_ONE) |
|---|
| 1088 | + hw_dev->is_single = false; |
|---|
| 1067 | 1089 | for (i = 0; i < hw_dev->dev_num; i++) { |
|---|
| 1068 | 1090 | isp = hw_dev->isp[i]; |
|---|
| 1069 | 1091 | if (!isp || (isp && !isp->is_hw_link)) |
|---|
| .. | .. |
|---|
| 1077 | 1099 | struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); |
|---|
| 1078 | 1100 | void __iomem *base = hw_dev->base_addr; |
|---|
| 1079 | 1101 | struct rkisp_device *isp; |
|---|
| 1080 | | - int mult = hw_dev->is_unite ? 2 : 1; |
|---|
| 1102 | + int mult = hw_dev->unite ? 2 : 1; |
|---|
| 1081 | 1103 | int ret, i; |
|---|
| 1082 | 1104 | void *buf; |
|---|
| 1083 | 1105 | |
|---|
| .. | .. |
|---|
| 1093 | 1115 | buf = isp->sw_base_addr; |
|---|
| 1094 | 1116 | memset(buf, 0, RKISP_ISP_SW_MAX_SIZE * mult); |
|---|
| 1095 | 1117 | memcpy_fromio(buf, base, RKISP_ISP_SW_REG_SIZE); |
|---|
| 1096 | | - if (hw_dev->is_unite) { |
|---|
| 1118 | + if (hw_dev->unite) { |
|---|
| 1097 | 1119 | buf += RKISP_ISP_SW_MAX_SIZE; |
|---|
| 1098 | 1120 | base = hw_dev->base_next_addr; |
|---|
| 1099 | 1121 | memcpy_fromio(buf, base, RKISP_ISP_SW_REG_SIZE); |
|---|