From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/media/platform/rockchip/isp/hw.c | 86 +++++++++++++++++++++++++++---------------- 1 files changed, 54 insertions(+), 32 deletions(-) diff --git a/kernel/drivers/media/platform/rockchip/isp/hw.c b/kernel/drivers/media/platform/rockchip/isp/hw.c index e6e4d9a..d9d1627 100644 --- a/kernel/drivers/media/platform/rockchip/isp/hw.c +++ b/kernel/drivers/media/platform/rockchip/isp/hw.c @@ -132,7 +132,7 @@ for (i = 0; i < size; i++) { flag = dev->sw_base_addr + reg[i] + RKISP_ISP_SW_REG_SIZE; *flag = SW_REG_CACHE; - if (dev->hw_dev->is_unite) { + if (dev->hw_dev->unite) { flag += RKISP_ISP_SW_MAX_SIZE / 4; *flag = SW_REG_CACHE; } @@ -144,7 +144,7 @@ struct device *dev = ctx; struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); struct rkisp_device *isp = hw_dev->isp[hw_dev->mipi_dev_id]; - void __iomem *base = !hw_dev->is_unite ? + void __iomem *base = hw_dev->unite != ISP_UNITE_TWO ? hw_dev->base_addr : hw_dev->base_next_addr; ktime_t t = 0; s64 us; @@ -201,7 +201,7 @@ struct device *dev = ctx; struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); struct rkisp_device *isp = hw_dev->isp[hw_dev->cur_dev_id]; - void __iomem *base = !hw_dev->is_unite ? + void __iomem *base = hw_dev->unite != ISP_UNITE_TWO ? hw_dev->base_addr : hw_dev->base_next_addr; u32 mis_val, tx_isr = MI_RAW0_WR_FRAME | MI_RAW1_WR_FRAME | MI_RAW2_WR_FRAME | MI_RAW3_WR_FRAME; @@ -237,7 +237,7 @@ struct device *dev = ctx; struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); struct rkisp_device *isp = hw_dev->isp[hw_dev->cur_dev_id]; - void __iomem *base = !hw_dev->is_unite ? + void __iomem *base = hw_dev->unite != ISP_UNITE_TWO ? hw_dev->base_addr : hw_dev->base_next_addr; unsigned int mis_val, mis_3a = 0; ktime_t t = 0; @@ -455,6 +455,9 @@ }, { .clk_rate = 350, .refer_data = 3072, + }, { + .clk_rate = 440, + .refer_data = 3840, } }; @@ -636,7 +639,7 @@ /* record clk config and recover */ iccl0 = readl(base + CIF_ICCL); clk_ctrl0 = readl(base + CTRL_VI_ISP_CLK_CTRL); - if (dev->is_unite) { + if (dev->unite == ISP_UNITE_TWO) { iccl1 = readl(dev->base_next_addr + CIF_ICCL); clk_ctrl1 = readl(dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL); } @@ -646,7 +649,7 @@ * isp soft reset first to protect isp reset. */ writel(0xffff, base + CIF_IRCL); - if (dev->is_unite) + if (dev->unite == ISP_UNITE_TWO) writel(0xffff, dev->base_next_addr + CIF_IRCL); udelay(10); } @@ -669,7 +672,7 @@ writel(val, base + CIF_IRCL); if (dev->isp_ver == ISP_V32) rv1106_sdmmc_put_lock(); - if (dev->is_unite) + if (dev->unite == ISP_UNITE_TWO) writel(0xffff, dev->base_next_addr + CIF_IRCL); udelay(10); @@ -681,7 +684,7 @@ writel(iccl0, base + CIF_ICCL); writel(clk_ctrl0, base + CTRL_VI_ISP_CLK_CTRL); - if (dev->is_unite) { + if (dev->unite == ISP_UNITE_TWO) { writel(iccl1, dev->base_next_addr + CIF_ICCL); writel(clk_ctrl1, dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL); } @@ -722,7 +725,7 @@ writel(val, dev->base_addr + CIF_ICCL); if (dev->isp_ver == ISP_V32) rv1106_sdmmc_put_lock(); - if (dev->is_unite) + if (dev->unite == ISP_UNITE_TWO) writel(val, dev->base_next_addr + CIF_ICCL); if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) { @@ -752,7 +755,7 @@ writel(val, dev->base_addr + CTRL_VI_ISP_CLK_CTRL); if (dev->isp_ver == ISP_V32) rv1106_sdmmc_put_lock(); - if (dev->is_unite) + if (dev->unite == ISP_UNITE_TWO) writel(val, dev->base_next_addr + CTRL_VI_ISP_CLK_CTRL); } } @@ -786,10 +789,12 @@ } } - rate = dev->clk_rate_tbl[0].clk_rate * 1000000UL; - rkisp_set_clk_rate(dev->clks[0], rate); - if (dev->is_unite) - rkisp_set_clk_rate(dev->clks[5], rate); + if (!dev->is_assigned_clk) { + rate = dev->clk_rate_tbl[0].clk_rate * 1000000UL; + rkisp_set_clk_rate(dev->clks[0], rate); + if (dev->unite == ISP_UNITE_TWO) + rkisp_set_clk_rate(dev->clks[5], rate); + } rkisp_soft_reset(dev, false); isp_config_clk(dev, true); return 0; @@ -848,6 +853,7 @@ struct resource *res; int i, ret; bool is_mem_reserved = true; + u32 clk_rate = 0; match = of_match_node(rkisp_hw_of_match, node); if (IS_ERR(match)) @@ -858,21 +864,11 @@ return -ENOMEM; match_data = match->data; - hw_dev->is_unite = match_data->unite; dev_set_drvdata(dev, hw_dev); hw_dev->dev = dev; hw_dev->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); dev_info(dev, "is_thunderboot: %d\n", hw_dev->is_thunderboot); - memset(&hw_dev->max_in, 0, sizeof(hw_dev->max_in)); - if (!of_property_read_u32_array(node, "max-input", &hw_dev->max_in.w, 3)) { - hw_dev->max_in.is_fix = true; - if (hw_dev->is_unite) { - hw_dev->max_in.w /= 2; - hw_dev->max_in.w += RKMOUDLE_UNITE_EXTEND_PIXEL; - } - } - dev_info(dev, "max input:%dx%d@%dfps\n", - hw_dev->max_in.w, hw_dev->max_in.h, hw_dev->max_in.fps); + hw_dev->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf"); if (IS_ERR(hw_dev->grf)) dev_warn(dev, "Missing rockchip,grf property\n"); @@ -919,6 +915,27 @@ } } + hw_dev->isp_ver = match_data->isp_ver; + if (match_data->unite) { + hw_dev->unite = ISP_UNITE_TWO; + } else if (device_property_read_bool(dev, "rockchip,unite-en")) { + hw_dev->unite = ISP_UNITE_ONE; + hw_dev->base_next_addr = hw_dev->base_addr; + } else { + hw_dev->unite = ISP_UNITE_NONE; + } + + memset(&hw_dev->max_in, 0, sizeof(hw_dev->max_in)); + if (!of_property_read_u32_array(node, "max-input", &hw_dev->max_in.w, 3)) { + hw_dev->max_in.is_fix = true; + if (hw_dev->unite) { + hw_dev->max_in.w /= 2; + hw_dev->max_in.w += RKMOUDLE_UNITE_EXTEND_PIXEL; + } + } + dev_info(dev, "max input:%dx%d@%dfps\n", + hw_dev->max_in.w, hw_dev->max_in.h, hw_dev->max_in.fps); + rkisp_monitor = device_property_read_bool(dev, "rockchip,restart-monitor-en"); hw_dev->mipi_irq = -1; @@ -941,6 +958,11 @@ hw_dev->clk_rate_tbl = match_data->clk_rate_tbl; hw_dev->num_clk_rate_tbl = match_data->num_clk_rate_tbl; + hw_dev->is_assigned_clk = false; + ret = of_property_read_u32(node, "assigned-clock-rates", &clk_rate); + if (!ret && clk_rate) + hw_dev->is_assigned_clk = true; + hw_dev->reset = devm_reset_control_array_get(dev, false, false); if (IS_ERR(hw_dev->reset)) { dev_dbg(dev, "failed to get reset\n"); @@ -959,10 +981,8 @@ hw_dev->dev_link_num = 0; hw_dev->cur_dev_id = 0; hw_dev->mipi_dev_id = 0; - hw_dev->pre_dev_id = 0; + hw_dev->pre_dev_id = -1; hw_dev->is_multi_overflow = false; - hw_dev->isp_ver = match_data->isp_ver; - hw_dev->is_unite = match_data->unite; mutex_init(&hw_dev->dev_lock); spin_lock_init(&hw_dev->rdbk_lock); atomic_set(&hw_dev->refcnt, 0); @@ -1012,7 +1032,7 @@ hw_dev->is_shutdown = true; if (pm_runtime_active(&pdev->dev)) { writel(0xffff, hw_dev->base_addr + CIF_IRCL); - if (hw_dev->is_unite) + if (hw_dev->unite == ISP_UNITE_TWO) writel(0xffff, hw_dev->base_next_addr + CIF_IRCL); } dev_info(&pdev->dev, "%s\n", __func__); @@ -1052,7 +1072,7 @@ hw_dev->is_single = false; w = isp->isp_sdev.in_crop.width; h = isp->isp_sdev.in_crop.height; - if (hw_dev->is_unite) + if (hw_dev->unite) w = w / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; hw_dev->isp_size[i].w = w; hw_dev->isp_size[i].h = h; @@ -1064,6 +1084,8 @@ hw_dev->max_in.h = h; } } + if (hw_dev->unite == ISP_UNITE_ONE) + hw_dev->is_single = false; for (i = 0; i < hw_dev->dev_num; i++) { isp = hw_dev->isp[i]; if (!isp || (isp && !isp->is_hw_link)) @@ -1077,7 +1099,7 @@ struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); void __iomem *base = hw_dev->base_addr; struct rkisp_device *isp; - int mult = hw_dev->is_unite ? 2 : 1; + int mult = hw_dev->unite ? 2 : 1; int ret, i; void *buf; @@ -1093,7 +1115,7 @@ buf = isp->sw_base_addr; memset(buf, 0, RKISP_ISP_SW_MAX_SIZE * mult); memcpy_fromio(buf, base, RKISP_ISP_SW_REG_SIZE); - if (hw_dev->is_unite) { + if (hw_dev->unite) { buf += RKISP_ISP_SW_MAX_SIZE; base = hw_dev->base_next_addr; memcpy_fromio(buf, base, RKISP_ISP_SW_REG_SIZE); -- Gitblit v1.6.2