From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 03 Jan 2024 09:43:39 +0000
Subject: [PATCH] update kernel to 5.10.198

---
 kernel/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c |   86 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 72 insertions(+), 14 deletions(-)

diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c b/kernel/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c
index 373818c..6ce85e8 100644
--- a/kernel/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c
+++ b/kernel/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c
@@ -160,6 +160,7 @@
 		if (csi_idx < 2) {
 			dcphy_hw = dphy->samsung_phy_group[csi_idx];
 			mutex_lock(&dcphy_hw->mutex);
+			dcphy_hw->dphy_dev[dcphy_hw->dphy_dev_num] = dphy;
 			dcphy_hw->dphy_dev_num++;
 			mutex_unlock(&dcphy_hw->mutex);
 			dphy->samsung_phy = dcphy_hw;
@@ -199,6 +200,7 @@
 				else
 					dphy->phy_index = 5;
 			}
+			dphy_hw->dphy_dev[dphy_hw->dphy_dev_num] = dphy;
 			dphy_hw->dphy_dev_num++;
 			dphy->dphy_hw = dphy_hw;
 			dphy->phy_hw[index] = (void *)dphy_hw;
@@ -253,12 +255,56 @@
 	return 0;
 }
 
+static void rockchip_csi2_samsung_phy_remove_dphy_dev(struct csi2_dphy *dphy,
+						   struct samsung_mipi_dcphy *dcphy_hw)
+{
+	int i = 0;
+	bool is_find_dev = false;
+	struct csi2_dphy *csi2_dphy = NULL;
+
+	for (i = 0; i < dcphy_hw->dphy_dev_num; i++) {
+		csi2_dphy = dcphy_hw->dphy_dev[i];
+		if (csi2_dphy &&
+		    csi2_dphy->phy_index == dphy->phy_index)
+			is_find_dev = true;
+		if (is_find_dev) {
+			if (i < dcphy_hw->dphy_dev_num - 1)
+				dcphy_hw->dphy_dev[i] = dcphy_hw->dphy_dev[i + 1];
+			else
+				dcphy_hw->dphy_dev[i] = NULL;
+		}
+	}
+	if (is_find_dev)
+		dcphy_hw->dphy_dev_num--;
+}
+
+static void rockchip_csi2_inno_phy_remove_dphy_dev(struct csi2_dphy *dphy,
+						   struct csi2_dphy_hw *dphy_hw)
+{
+	int i = 0;
+	bool is_find_dev = false;
+	struct csi2_dphy *csi2_dphy = NULL;
+
+	for (i = 0; i < dphy_hw->dphy_dev_num; i++) {
+		csi2_dphy = dphy_hw->dphy_dev[i];
+		if (csi2_dphy &&
+		    csi2_dphy->phy_index == dphy->phy_index)
+			is_find_dev = true;
+		if (is_find_dev) {
+			if (i < dphy_hw->dphy_dev_num - 1)
+				dphy_hw->dphy_dev[i] = dphy_hw->dphy_dev[i + 1];
+			else
+				dphy_hw->dphy_dev[i] = NULL;
+		}
+	}
+	if (is_find_dev)
+		dphy_hw->dphy_dev_num--;
+}
+
 static int rockchip_csi2_dphy_detach_hw(struct csi2_dphy *dphy, int csi_idx, int index)
 {
 	struct csi2_dphy_hw *dphy_hw = NULL;
 	struct samsung_mipi_dcphy *dcphy_hw = NULL;
-	struct csi2_dphy *csi2_dphy = NULL;
-	int i = 0;
 
 	if (dphy->drv_data->chip_id == CHIP_ID_RK3568 ||
 	    dphy->drv_data->chip_id == CHIP_ID_RV1106) {
@@ -269,15 +315,7 @@
 			return -EINVAL;
 		}
 		mutex_lock(&dphy_hw->mutex);
-		for (i = 0; i < dphy_hw->dphy_dev_num; i++) {
-			csi2_dphy = dphy_hw->dphy_dev[i];
-			if (csi2_dphy &&
-			    csi2_dphy->phy_index == dphy->phy_index) {
-				dphy_hw->dphy_dev[i] = NULL;
-				dphy_hw->dphy_dev_num--;
-				break;
-			}
-		}
+		rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw);
 		mutex_unlock(&dphy_hw->mutex);
 	} else if (dphy->drv_data->chip_id == CHIP_ID_RK3588) {
 		if (csi_idx < 2) {
@@ -288,7 +326,7 @@
 				return -EINVAL;
 			}
 			mutex_lock(&dcphy_hw->mutex);
-			dcphy_hw->dphy_dev_num--;
+			rockchip_csi2_samsung_phy_remove_dphy_dev(dphy, dcphy_hw);
 			mutex_unlock(&dcphy_hw->mutex);
 		} else {
 			dphy_hw = (struct csi2_dphy_hw *)dphy->phy_hw[index];
@@ -298,7 +336,7 @@
 				return -EINVAL;
 			}
 			mutex_lock(&dphy_hw->mutex);
-			dphy_hw->dphy_dev_num--;
+			rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw);
 			mutex_unlock(&dphy_hw->mutex);
 		}
 	} else {
@@ -309,7 +347,7 @@
 			return -EINVAL;
 		}
 		mutex_lock(&dphy_hw->mutex);
-		dphy_hw->dphy_dev_num--;
+		rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw);
 		mutex_unlock(&dphy_hw->mutex);
 	}
 
@@ -651,6 +689,8 @@
 {
 	struct csi2_dphy *dphy = to_csi2_dphy(sd);
 	long ret = 0;
+	int i = 0;
+	int on = 0;
 
 	switch (cmd) {
 	case RKCIF_CMD_SET_CSI_IDX:
@@ -658,6 +698,24 @@
 		    dphy->drv_data->chip_id != CHIP_ID_RV1106)
 			dphy->csi_info = *((struct rkcif_csi_info *)arg);
 		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		for (i = 0; i < dphy->csi_info.csi_num; i++) {
+			if (dphy->csi_info.dphy_vendor[i] == PHY_VENDOR_INNO) {
+				dphy->dphy_hw = (struct csi2_dphy_hw *)dphy->phy_hw[i];
+				if (!dphy->dphy_hw ||
+				    !dphy->dphy_hw->quick_stream_off ||
+				    !dphy->dphy_hw->quick_stream_on) {
+					ret = -EINVAL;
+					break;
+				}
+				on = *(int *)arg;
+				if (on)
+					dphy->dphy_hw->quick_stream_on(dphy, sd);
+				else
+					dphy->dphy_hw->quick_stream_off(dphy, sd);
+			}
+		}
+		break;
 	default:
 		ret = -ENOIOCTLCMD;
 		break;

--
Gitblit v1.6.2