From 9999e48639b3cecb08ffb37358bcba3b48161b29 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 08:50:17 +0000
Subject: [PATCH] add ax88772_rst

---
 kernel/drivers/media/platform/rockchip/isp/common.c |  166 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 156 insertions(+), 10 deletions(-)

diff --git a/kernel/drivers/media/platform/rockchip/isp/common.c b/kernel/drivers/media/platform/rockchip/isp/common.c
index f0bd64f..80536de 100644
--- a/kernel/drivers/media/platform/rockchip/isp/common.c
+++ b/kernel/drivers/media/platform/rockchip/isp/common.c
@@ -6,6 +6,7 @@
 #include <linux/of_platform.h>
 #include <linux/slab.h>
 #include "dev.h"
+#include "hw.h"
 #include "isp_ispp.h"
 #include "regs.h"
 
@@ -18,7 +19,27 @@
 	*flag = SW_REG_CACHE;
 	if (dev->hw_dev->is_single || is_direct) {
 		*flag = SW_REG_CACHE_SYNC;
+		if (dev->isp_ver == ISP_V32 && reg <= 0x200)
+			rv1106_sdmmc_get_lock();
 		writel(val, dev->hw_dev->base_addr + reg);
+		if (dev->isp_ver == ISP_V32 && reg <= 0x200)
+			rv1106_sdmmc_put_lock();
+	}
+}
+
+void rkisp_next_write(struct rkisp_device *dev, u32 reg, u32 val, bool is_direct)
+{
+	u32 offset = RKISP_ISP_SW_MAX_SIZE + reg;
+	u32 *mem = dev->sw_base_addr + offset;
+	u32 *flag = dev->sw_base_addr + offset + RKISP_ISP_SW_REG_SIZE;
+
+	*mem = val;
+	*flag = SW_REG_CACHE;
+	if (dev->hw_dev->is_single || is_direct) {
+		*flag = SW_REG_CACHE_SYNC;
+		if (dev->hw_dev->unite == ISP_UNITE_ONE)
+			return;
+		writel(val, dev->hw_dev->base_next_addr + reg);
 	}
 }
 
@@ -33,9 +54,15 @@
 	return val;
 }
 
-u32 rkisp_read_reg_cache(struct rkisp_device *dev, u32 reg)
+u32 rkisp_next_read(struct rkisp_device *dev, u32 reg, bool is_direct)
 {
-	return *(u32 *)(dev->sw_base_addr + reg);
+	u32 val;
+
+	if (dev->hw_dev->is_single || is_direct)
+		val = readl(dev->hw_dev->base_next_addr + reg);
+	else
+		val = *(u32 *)(dev->sw_base_addr + RKISP_ISP_SW_MAX_SIZE + reg);
+	return val;
 }
 
 void rkisp_set_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val, bool is_direct)
@@ -45,6 +72,13 @@
 	rkisp_write(dev, reg, val | tmp, is_direct);
 }
 
+void rkisp_next_set_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val, bool is_direct)
+{
+	u32 tmp = rkisp_next_read(dev, reg, is_direct) & ~mask;
+
+	rkisp_next_write(dev, reg, val | tmp, is_direct);
+}
+
 void rkisp_clear_bits(struct rkisp_device *dev, u32 reg, u32 mask, bool is_direct)
 {
 	u32 tmp = rkisp_read(dev, reg, is_direct);
@@ -52,9 +86,70 @@
 	rkisp_write(dev, reg, tmp & ~mask, is_direct);
 }
 
+void rkisp_next_clear_bits(struct rkisp_device *dev, u32 reg, u32 mask, bool is_direct)
+{
+	u32 tmp = rkisp_next_read(dev, reg, is_direct);
+
+	rkisp_next_write(dev, reg, tmp & ~mask, is_direct);
+}
+
+void rkisp_write_reg_cache(struct rkisp_device *dev, u32 reg, u32 val)
+{
+	u32 *mem = dev->sw_base_addr + reg;
+
+	*mem = val;
+}
+
+void rkisp_next_write_reg_cache(struct rkisp_device *dev, u32 reg, u32 val)
+{
+	u32 offset = RKISP_ISP_SW_MAX_SIZE + reg;
+	u32 *mem = dev->sw_base_addr + offset;
+
+	*mem = val;
+}
+
+u32 rkisp_read_reg_cache(struct rkisp_device *dev, u32 reg)
+{
+	return *(u32 *)(dev->sw_base_addr + reg);
+}
+
+u32 rkisp_next_read_reg_cache(struct rkisp_device *dev, u32 reg)
+{
+	return *(u32 *)(dev->sw_base_addr + RKISP_ISP_SW_MAX_SIZE + reg);
+}
+
+void rkisp_set_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val)
+{
+	u32 tmp = rkisp_read_reg_cache(dev, reg) & ~mask;
+
+	rkisp_write_reg_cache(dev, reg, val | tmp);
+}
+
+void rkisp_next_set_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val)
+{
+	u32 tmp = rkisp_next_read_reg_cache(dev, reg) & ~mask;
+
+	rkisp_next_write_reg_cache(dev, reg, val | tmp);
+}
+
+void rkisp_clear_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask)
+{
+	u32 tmp = rkisp_read_reg_cache(dev, reg);
+
+	rkisp_write_reg_cache(dev, reg, tmp & ~mask);
+}
+
+void rkisp_next_clear_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask)
+{
+	u32 tmp = rkisp_next_read_reg_cache(dev, reg);
+
+	rkisp_next_write_reg_cache(dev, reg, tmp & ~mask);
+}
+
 void rkisp_update_regs(struct rkisp_device *dev, u32 start, u32 end)
 {
-	void __iomem *base = dev->hw_dev->base_addr;
+	struct rkisp_hw_dev *hw = dev->hw_dev;
+	void __iomem *base = hw->base_addr;
 	u32 i;
 
 	if (end > RKISP_ISP_SW_REG_SIZE - 4) {
@@ -65,8 +160,35 @@
 		u32 *val = dev->sw_base_addr + i;
 		u32 *flag = dev->sw_base_addr + i + RKISP_ISP_SW_REG_SIZE;
 
-		if (*flag == SW_REG_CACHE)
+		if (dev->procfs.mode & RKISP_PROCFS_FIL_SW) {
+			if (!((i >= ISP3X_ISP_ACQ_H_OFFS && i <= ISP3X_ISP_ACQ_V_SIZE) ||
+			      (i >= ISP3X_ISP_OUT_H_OFFS && i <= ISP3X_ISP_OUT_V_SIZE) ||
+			      (i >= ISP3X_DUAL_CROP_BASE && i < ISP3X_DUAL_CROP_FBC_V_SIZE_SHD) ||
+			      (i >= ISP3X_MAIN_RESIZE_BASE && i < ISP3X_CSI2RX_VERSION) ||
+			      (i >= CIF_ISP_IS_BASE && i < CIF_ISP_IS_V_SIZE_SHD)))
+				continue;
+		}
+
+		if (hw->unite == ISP_UNITE_ONE && dev->unite_index == ISP_UNITE_RIGHT) {
+			val = dev->sw_base_addr + i + RKISP_ISP_SW_MAX_SIZE;
+			flag = dev->sw_base_addr + i + RKISP_ISP_SW_MAX_SIZE + RKISP_ISP_SW_REG_SIZE;
+		}
+
+		if (*flag == SW_REG_CACHE) {
+			if ((i == ISP3X_MAIN_RESIZE_CTRL ||
+			     i == ISP32_BP_RESIZE_CTRL ||
+			     i == ISP3X_SELF_RESIZE_CTRL) && *val == 0)
+				*val = CIF_RSZ_CTRL_CFG_UPD;
 			writel(*val, base + i);
+			if (hw->unite == ISP_UNITE_TWO) {
+				val = dev->sw_base_addr + i + RKISP_ISP_SW_MAX_SIZE;
+				if ((i == ISP3X_MAIN_RESIZE_CTRL ||
+				     i == ISP32_BP_RESIZE_CTRL ||
+				     i == ISP3X_SELF_RESIZE_CTRL) && *val == 0)
+					*val = CIF_RSZ_CTRL_CFG_UPD;
+				writel(*val, hw->base_next_addr + i);
+			}
+		}
 	}
 }
 
@@ -78,6 +200,8 @@
 	struct sg_table	 *sg_tbl;
 	void *mem_priv;
 	int ret = 0;
+
+	mutex_lock(&dev->buf_lock);
 
 	if (!buf->size) {
 		ret = -EINVAL;
@@ -119,8 +243,10 @@
 	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
 		 "%s buf:0x%x~0x%x size:%d\n", __func__,
 		 (u32)buf->dma_addr, (u32)buf->dma_addr + buf->size, buf->size);
+	mutex_unlock(&dev->buf_lock);
 	return ret;
 err:
+	mutex_unlock(&dev->buf_lock);
 	dev_err(dev->dev, "%s failed ret:%d\n", __func__, ret);
 	return ret;
 }
@@ -130,6 +256,7 @@
 {
 	const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
 
+	mutex_lock(&dev->buf_lock);
 	if (buf && buf->mem_priv) {
 		v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
 			 "%s buf:0x%x~0x%x\n", __func__,
@@ -145,6 +272,7 @@
 		buf->is_need_vaddr = false;
 		buf->is_need_dmafd = false;
 	}
+	mutex_unlock(&dev->buf_lock);
 }
 
 void rkisp_prepare_buffer(struct rkisp_device *dev,
@@ -190,8 +318,11 @@
 		return -EINVAL;
 	}
 
-	if (hw->dev_num)
-		hw->is_single = false;
+	if (hw->dev_num >= DEV_MAX) {
+		dev_err(isp->dev, "failed attach isp hw, max dev:%d\n", DEV_MAX);
+		return -EINVAL;
+	}
+
 	isp->dev_id = hw->dev_num;
 	hw->isp[hw->dev_num] = isp;
 	hw->dev_num++;
@@ -269,7 +400,7 @@
 	struct rkisp_dummy_buffer *dummy_buf = &hw->dummy_buf;
 	struct rkisp_stream *stream;
 	struct rkisp_device *isp;
-	u32 i, j, size = 0;
+	u32 i, j, val, size = 0;
 	int ret = 0;
 
 	if (dummy_buf->mem_priv)
@@ -279,13 +410,17 @@
 		size = hw->max_in.w * hw->max_in.h * 2;
 	for (i = 0; i < hw->dev_num; i++) {
 		isp = hw->isp[i];
+		if (!isp || (isp && !isp->is_hw_link))
+			continue;
 		for (j = 0; j < RKISP_MAX_STREAM; j++) {
 			stream = &isp->cap_dev.stream[j];
 			if (!stream->linked)
 				continue;
-			size = max(size,
-				   stream->out_fmt.plane_fmt[0].bytesperline *
-				   stream->out_fmt.height);
+			val = stream->out_isp_fmt.fmt_type == FMT_FBC ?
+				stream->out_fmt.plane_fmt[1].sizeimage :
+				stream->out_fmt.plane_fmt[0].bytesperline *
+				stream->out_fmt.height;
+			size = max(size, val);
 		}
 	}
 	if (size == 0)
@@ -321,3 +456,14 @@
 	else
 		rkisp_free_buffer(dev, &hw->dummy_buf);
 }
+
+u64 rkisp_time_get_ns(struct rkisp_device *dev)
+{
+	u64 ns;
+
+	if (dev->isp_ver == ISP_V32)
+		ns = ktime_get_boottime_ns();
+	else
+		ns = ktime_get_ns();
+	return ns;
+}

--
Gitblit v1.6.2