From f56843c1f15596f6c1a766d0302fe7c54f0c8cd1 Mon Sep 17 00:00:00 2001
From: Sebastian Reichel <sebastian.reichel@collabora.com>
Date: Fri, 7 Mar 2025 19:40:24 +0100
Subject: [PATCH] media: rockchip: vicap: have per ISP latency debug gpios

Technically we should have per channel gpios, but that's 12 in
total and seems quite pointless considering this won't be send
upstream. But for dual camera we want to split between ISP0 and
ISP1 to get sensible edges.
---
 drivers/media/platform/rockchip/cif/capture.c | 29 ++++++++++++++-----
 drivers/media/platform/rockchip/cif/hw.c      | 18 ++++++++----
 drivers/media/platform/rockchip/cif/hw.h      |  6 ++--
 3 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index f5631dc561f4a..bbc8e9525ec68 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -12043,16 +12043,29 @@ unsigned int rkcif_irq_global(struct rkcif_device *cif_dev)
 	else
 		return intstat_glb;
 
-	/* VICAP_GLB_INTST frame_end_toisp (all channels on both ISPs), see TRM1 page 2085-2086 */
-	if (intstat_glb & GENMASK(25,20)) {
-		int val = gpiod_get_value(cif_dev->hw_dev->frame_end_gpio);
-		gpiod_set_value(cif_dev->hw_dev->frame_end_gpio, !val);
+	/* VICAP_GLB_INTST frame_end_toisp1_chX (all channels on ISP1), see TRM1 page 2085-2086 */
+	if (intstat_glb & GENMASK(25,23)) {
+		int val = gpiod_get_value(cif_dev->hw_dev->isp0_frame_end_gpio);
+		gpiod_set_value(cif_dev->hw_dev->isp0_frame_end_gpio, !val);
 	}
 
-	/* VICAP_GLB_INTST frame_start_toisp (all channels on both ISPs), see TRM1 page 2085-2086 */
-	if (intstat_glb & GENMASK(19,14)) {
-		int val = gpiod_get_value(cif_dev->hw_dev->frame_start_gpio);
-		gpiod_set_value(cif_dev->hw_dev->frame_start_gpio, !val);
+	/* VICAP_GLB_INTST frame_end_toisp0_chX (all channels on ISP0), see TRM1 page 2085-2086 */
+	if (intstat_glb & GENMASK(22,20)) {
+		int val = gpiod_get_value(cif_dev->hw_dev->isp0_frame_end_gpio);
+		gpiod_set_value(cif_dev->hw_dev->isp0_frame_end_gpio, !val);
+	}
+
+	/* VICAP_GLB_INTST frame_start_toisp1_chX (all channels on ISP1), see TRM1 page 2085-2086 */
+	if (intstat_glb & GENMASK(19,17)) {
+		int val = gpiod_get_value(cif_dev->hw_dev->isp0_frame_start_gpio);
+		gpiod_set_value(cif_dev->hw_dev->isp0_frame_start_gpio, !val);
+	}
+
+
+	/* VICAP_GLB_INTST frame_start_toisp0_chX (all channels on ISP0), see TRM1 page 2085-2086 */
+	if (intstat_glb & GENMASK(16,14)) {
+		int val = gpiod_get_value(cif_dev->hw_dev->isp0_frame_start_gpio);
+		gpiod_set_value(cif_dev->hw_dev->isp0_frame_start_gpio, !val);
 	}
 
 	if (intstat_glb & SCALE_TOISP_AXI0_ERR) {
diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c
index 4c0937c9a62cc..840f619690e64 100644
--- a/drivers/media/platform/rockchip/cif/hw.c
+++ b/drivers/media/platform/rockchip/cif/hw.c
@@ -1473,12 +1473,18 @@ static int rkcif_plat_hw_probe(struct platform_device *pdev)
 	if (irq < 0)
 		return irq;
 
-	cif_hw->frame_start_gpio = gpiod_get_optional(dev, "frame-start-notify", GPIOD_OUT_LOW);
-	if (IS_ERR(cif_hw->frame_start_gpio))
-		return dev_err_probe(dev, PTR_ERR(cif_hw->frame_start_gpio), "failed to get frame start notify GPIO");
-	cif_hw->frame_end_gpio = gpiod_get_optional(dev, "frame-end-notify", GPIOD_OUT_LOW);
-	if (IS_ERR(cif_hw->frame_end_gpio))
-		return dev_err_probe(dev, PTR_ERR(cif_hw->frame_end_gpio), "failed to get frame end notify GPIO");
+	cif_hw->isp0_frame_start_gpio = gpiod_get_optional(dev, "isp0-frame-start-notify", GPIOD_OUT_LOW);
+	if (IS_ERR(cif_hw->isp0_frame_start_gpio))
+		return dev_err_probe(dev, PTR_ERR(cif_hw->isp0_frame_start_gpio), "failed to get frame start notify GPIO");
+	cif_hw->isp0_frame_end_gpio = gpiod_get_optional(dev, "isp0-frame-end-notify", GPIOD_OUT_LOW);
+	if (IS_ERR(cif_hw->isp0_frame_end_gpio))
+		return dev_err_probe(dev, PTR_ERR(cif_hw->isp0_frame_end_gpio), "failed to get frame end notify GPIO");
+	cif_hw->isp1_frame_start_gpio = gpiod_get_optional(dev, "isp1-frame-start-notify", GPIOD_OUT_LOW);
+	if (IS_ERR(cif_hw->isp1_frame_start_gpio))
+		return dev_err_probe(dev, PTR_ERR(cif_hw->isp1_frame_start_gpio), "failed to get frame start notify GPIO");
+	cif_hw->isp1_frame_end_gpio = gpiod_get_optional(dev, "isp1-frame-end-notify", GPIOD_OUT_LOW);
+	if (IS_ERR(cif_hw->isp1_frame_end_gpio))
+		return dev_err_probe(dev, PTR_ERR(cif_hw->isp1_frame_end_gpio), "failed to get frame end notify GPIO");
 
 	ret = devm_request_irq(dev, irq, rkcif_irq_handler,
 			       IRQF_SHARED,
diff --git a/drivers/media/platform/rockchip/cif/hw.h b/drivers/media/platform/rockchip/cif/hw.h
index 04dcd24fbff9b..95a1a2c579e81 100644
--- a/drivers/media/platform/rockchip/cif/hw.h
+++ b/drivers/media/platform/rockchip/cif/hw.h
@@ -154,8 +154,10 @@ struct rkcif_hw {
 	bool				adapt_to_usbcamerahal;
 	u64				irq_time;
 	bool				is_rk3588s2;
-	struct gpio_desc		*frame_start_gpio;
-	struct gpio_desc		*frame_end_gpio;
+	struct gpio_desc		*isp0_frame_start_gpio;
+	struct gpio_desc		*isp0_frame_end_gpio;
+	struct gpio_desc		*isp1_frame_start_gpio;
+	struct gpio_desc		*isp1_frame_end_gpio;
 };
 
 void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu);
-- 
GitLab