From 04dd17822334871b23ea2862f7798fb0e0007777 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 11 May 2024 08:53:19 +0000
Subject: [PATCH] change otg to host mode

---
 kernel/drivers/media/i2c/sc430cs.c |   59 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/kernel/drivers/media/i2c/sc430cs.c b/kernel/drivers/media/i2c/sc430cs.c
index 5ff6850..8c88bc5 100644
--- a/kernel/drivers/media/i2c/sc430cs.c
+++ b/kernel/drivers/media/i2c/sc430cs.c
@@ -113,14 +113,6 @@
 
 #define SC430CS_NUM_SUPPLIES ARRAY_SIZE(sc430cs_supply_names)
 
-enum sc430cs_max_pad {
-	PAD0, /* link to isp */
-	PAD1, /* link to csi wr0 | hdr x2:L x3:M */
-	PAD2, /* link to csi wr1 | hdr      x3:L */
-	PAD3, /* link to csi wr2 | hdr x2:M x3:S */
-	PAD_MAX,
-};
-
 struct regval {
 	u16 addr;
 	u8 val;
@@ -149,7 +141,7 @@
 	struct pinctrl		*pinctrl;
 	struct pinctrl_state	*pins_default;
 	struct pinctrl_state	*pins_sleep;
-
+	struct v4l2_fract	cur_fps;
 	struct v4l2_subdev	subdev;
 	struct media_pad	pad;
 	struct v4l2_ctrl_handler ctrl_handler;
@@ -570,6 +562,8 @@
 		__v4l2_ctrl_modify_range(sc430cs->vblank, vblank_def,
 					 SC430CS_VTS_MAX - mode->height,
 					 1, vblank_def);
+		sc430cs->cur_fps = mode->max_fps;
+		sc430cs->cur_vts = (u32)mode->vts_def;
 	}
 
 	mutex_unlock(&sc430cs->mutex);
@@ -662,14 +656,15 @@
 	struct sc430cs *sc430cs = to_sc430cs(sd);
 	const struct sc430cs_mode *mode = sc430cs->cur_mode;
 
-	mutex_lock(&sc430cs->mutex);
-	fi->interval = mode->max_fps;
-	mutex_unlock(&sc430cs->mutex);
+	if (sc430cs->streaming)
+		fi->interval = sc430cs->cur_fps;
+	else
+		fi->interval = mode->max_fps;
 
 	return 0;
 }
 
-static int sc430cs_g_mbus_config(struct v4l2_subdev *sd,
+static int sc430cs_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
 				 struct v4l2_mbus_config *config)
 {
 	struct sc430cs *sc430cs = to_sc430cs(sd);
@@ -683,7 +678,7 @@
 	if (mode->hdr_mode == HDR_X3)
 		val |= V4L2_MBUS_CSI2_CHANNEL_2;
 
-	config->type = V4L2_MBUS_CSI2;
+	config->type = V4L2_MBUS_CSI2_DPHY;
 	config->flags = val;
 
 	return 0;
@@ -739,6 +734,8 @@
 			__v4l2_ctrl_modify_range(sc430cs->hblank, w, w, 1, w);
 			__v4l2_ctrl_modify_range(sc430cs->vblank, h,
 						 SC430CS_VTS_MAX - sc430cs->cur_mode->height, 1, h);
+			sc430cs->cur_fps = sc430cs->cur_mode->max_fps;
+			sc430cs->cur_vts = sc430cs->cur_mode->vts_def;
 		}
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -783,8 +780,11 @@
 		}
 
 		ret = sc430cs_ioctl(sd, cmd, inf);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(inf);
 		break;
 	case RKMODULE_AWB_CFG:
@@ -797,6 +797,8 @@
 		ret = copy_from_user(cfg, up, sizeof(*cfg));
 		if (!ret)
 			ret = sc430cs_ioctl(sd, cmd, cfg);
+		else
+			ret = -EFAULT;
 		kfree(cfg);
 		break;
 	case RKMODULE_GET_HDR_CFG:
@@ -807,8 +809,11 @@
 		}
 
 		ret = sc430cs_ioctl(sd, cmd, hdr);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(hdr);
 		break;
 	case RKMODULE_SET_HDR_CFG:
@@ -821,6 +826,8 @@
 		ret = copy_from_user(hdr, up, sizeof(*hdr));
 		if (!ret)
 			ret = sc430cs_ioctl(sd, cmd, hdr);
+		else
+			ret = -EFAULT;
 		kfree(hdr);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -833,12 +840,16 @@
 		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
 		if (!ret)
 			ret = sc430cs_ioctl(sd, cmd, hdrae);
+		else
+			ret = -EFAULT;
 		kfree(hdrae);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		ret = copy_from_user(&stream, up, sizeof(u32));
 		if (!ret)
 			ret = sc430cs_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -1106,7 +1117,6 @@
 static const struct v4l2_subdev_video_ops sc430cs_video_ops = {
 	.s_stream = sc430cs_s_stream,
 	.g_frame_interval = sc430cs_g_frame_interval,
-	.g_mbus_config = sc430cs_g_mbus_config,
 };
 
 static const struct v4l2_subdev_pad_ops sc430cs_pad_ops = {
@@ -1115,6 +1125,7 @@
 	.enum_frame_interval = sc430cs_enum_frame_interval,
 	.get_fmt = sc430cs_get_fmt,
 	.set_fmt = sc430cs_set_fmt,
+	.get_mbus_config = sc430cs_g_mbus_config,
 };
 
 static const struct v4l2_subdev_ops sc430cs_subdev_ops = {
@@ -1122,6 +1133,14 @@
 	.video	= &sc430cs_video_ops,
 	.pad	= &sc430cs_pad_ops,
 };
+
+static void sc430cs_modify_fps_info(struct sc430cs *sc430cs)
+{
+	const struct sc430cs_mode *mode = sc430cs->cur_mode;
+
+	sc430cs->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def /
+				       sc430cs->cur_vts;
+}
 
 static int sc430cs_set_ctrl(struct v4l2_ctrl *ctrl)
 {
@@ -1181,7 +1200,9 @@
 					 SC430CS_REG_VALUE_08BIT,
 					 (ctrl->val + sc430cs->cur_mode->height)
 					 & 0xff);
-		sc430cs->cur_vts = ctrl->val + sc430cs->cur_mode->height;
+		if (!ret)
+			sc430cs->cur_vts = ctrl->val + sc430cs->cur_mode->height;
+		sc430cs_modify_fps_info(sc430cs);
 		break;
 	case V4L2_CID_TEST_PATTERN:
 		ret = sc430cs_enable_test_pattern(sc430cs, ctrl->val);
@@ -1275,6 +1296,8 @@
 	}
 
 	sc430cs->subdev.ctrl_handler = handler;
+	sc430cs->cur_fps = mode->max_fps;
+	sc430cs->cur_vts = mode->vts_def;
 
 	return 0;
 

--
Gitblit v1.6.2