From 95099d4622f8cb224d94e314c7a8e0df60b13f87 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 09 Dec 2023 08:38:01 +0000
Subject: [PATCH] enable docker ppp

---
 kernel/drivers/media/i2c/sc401ai.c |   48 +++++++++++++++++++++++++++++-------------------
 1 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/kernel/drivers/media/i2c/sc401ai.c b/kernel/drivers/media/i2c/sc401ai.c
index 1c0bfbe..450fbd8 100644
--- a/kernel/drivers/media/i2c/sc401ai.c
+++ b/kernel/drivers/media/i2c/sc401ai.c
@@ -120,14 +120,6 @@
 
 #define SC401AI_NUM_SUPPLIES ARRAY_SIZE(sc401ai_supply_names)
 
-enum sc401ai_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;
@@ -170,6 +162,7 @@
 	struct v4l2_ctrl	*pixel_rate;
 	struct v4l2_ctrl	*link_freq;
 	struct mutex		mutex;
+	struct v4l2_fract	cur_fps;
 	bool			streaming;
 	bool			power_on;
 	unsigned int		lane_num;
@@ -709,6 +702,8 @@
 		__v4l2_ctrl_modify_range(sc401ai->vblank, vblank_def,
 					 SC401AI_VTS_MAX - mode->height,
 					 1, vblank_def);
+		sc401ai->cur_fps = mode->max_fps;
+		sc401ai->cur_vts = mode->vts_def;
 	}
 
 	mutex_unlock(&sc401ai->mutex);
@@ -800,15 +795,17 @@
 	struct sc401ai *sc401ai = to_sc401ai(sd);
 	const struct sc401ai_mode *mode = sc401ai->cur_mode;
 
-	mutex_lock(&sc401ai->mutex);
-	fi->interval = mode->max_fps;
-	mutex_unlock(&sc401ai->mutex);
+	if (sc401ai->streaming)
+		fi->interval = sc401ai->cur_fps;
+	else
+		fi->interval = mode->max_fps;
 
 	return 0;
 }
 
 static int sc401ai_g_mbus_config(struct v4l2_subdev *sd,
-				 struct v4l2_mbus_config *config)
+				unsigned int pad_id,
+				struct v4l2_mbus_config *config)
 {
 	struct sc401ai *sc401ai = to_sc401ai(sd);
 	const struct sc401ai_mode *mode = sc401ai->cur_mode;
@@ -823,7 +820,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;
@@ -833,10 +830,10 @@
 				   struct rkmodule_inf *inf)
 {
 	memset(inf, 0, sizeof(*inf));
-	strlcpy(inf->base.sensor, SC401AI_NAME, sizeof(inf->base.sensor));
-	strlcpy(inf->base.module, sc401ai->module_name,
+	strscpy(inf->base.sensor, SC401AI_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, sc401ai->module_name,
 		sizeof(inf->base.module));
-	strlcpy(inf->base.lens, sc401ai->len_name, sizeof(inf->base.lens));
+	strscpy(inf->base.lens, sc401ai->len_name, sizeof(inf->base.lens));
 }
 
 static long sc401ai_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
@@ -1249,7 +1246,6 @@
 static const struct v4l2_subdev_video_ops sc401ai_video_ops = {
 	.s_stream = sc401ai_s_stream,
 	.g_frame_interval = sc401ai_g_frame_interval,
-	.g_mbus_config = sc401ai_g_mbus_config,
 };
 
 static const struct v4l2_subdev_pad_ops sc401ai_pad_ops = {
@@ -1258,6 +1254,7 @@
 	.enum_frame_interval = sc401ai_enum_frame_interval,
 	.get_fmt = sc401ai_get_fmt,
 	.set_fmt = sc401ai_set_fmt,
+	.get_mbus_config = sc401ai_g_mbus_config,
 };
 
 static const struct v4l2_subdev_ops sc401ai_subdev_ops = {
@@ -1265,6 +1262,14 @@
 	.video	= &sc401ai_video_ops,
 	.pad	= &sc401ai_pad_ops,
 };
+
+static void sc401ai_modify_fps_info(struct sc401ai *sc401ai)
+{
+	const struct sc401ai_mode *mode = sc401ai->cur_mode;
+
+	sc401ai->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def /
+				       sc401ai->cur_vts;
+}
 
 static int sc401ai_set_ctrl(struct v4l2_ctrl *ctrl)
 {
@@ -1324,7 +1329,10 @@
 					 SC401AI_REG_VALUE_08BIT,
 					 (ctrl->val + sc401ai->cur_mode->height)
 					 & 0xff);
-		sc401ai->cur_vts = ctrl->val + sc401ai->cur_mode->height;
+		if (!ret)
+			sc401ai->cur_vts = ctrl->val + sc401ai->cur_mode->height;
+		if (sc401ai->cur_vts != sc401ai->cur_mode->vts_def)
+			sc401ai_modify_fps_info(sc401ai);
 		break;
 	case V4L2_CID_TEST_PATTERN:
 		ret = sc401ai_enable_test_pattern(sc401ai, ctrl->val);
@@ -1466,6 +1474,8 @@
 	}
 
 	sc401ai->subdev.ctrl_handler = handler;
+	sc401ai->cur_fps = mode->max_fps;
+	sc401ai->cur_vts = mode->vts_def;
 
 	return 0;
 
@@ -1713,4 +1723,4 @@
 module_exit(sensor_mod_exit);
 
 MODULE_DESCRIPTION("smartsens sc401ai sensor driver");
-MODULE_LICENSE("GPL v2");
+MODULE_LICENSE("GPL");

--
Gitblit v1.6.2