From 9370bb92b2d16684ee45cf24e879c93c509162da Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Thu, 19 Dec 2024 01:47:39 +0000
Subject: [PATCH] add wifi6 8852be driver

---
 kernel/drivers/media/i2c/sc2239.c |   43 ++++++++++++++++++++++++++++++++++---------
 1 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/kernel/drivers/media/i2c/sc2239.c b/kernel/drivers/media/i2c/sc2239.c
index 30dba3b..f56fe45 100644
--- a/kernel/drivers/media/i2c/sc2239.c
+++ b/kernel/drivers/media/i2c/sc2239.c
@@ -118,6 +118,8 @@
 	struct v4l2_ctrl	*vblank;
 	struct v4l2_ctrl	*test_pattern;
 	struct mutex		mutex;
+	struct v4l2_fract	cur_fps;
+	u32			cur_vts;
 	bool			streaming;
 	bool			power_on;
 	const struct sc2239_mode *cur_mode;
@@ -406,6 +408,8 @@
 		__v4l2_ctrl_modify_range(sc2239->vblank, vblank_def,
 					 SC2239_VTS_MAX - mode->height,
 					 1, vblank_def);
+		sc2239->cur_fps = mode->max_fps;
+		sc2239->cur_vts = mode->vts_def;
 	}
 
 	mutex_unlock(&sc2239->mutex);
@@ -542,8 +546,11 @@
 		}
 
 		ret = sc2239_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:
@@ -556,12 +563,16 @@
 		ret = copy_from_user(cfg, up, sizeof(*cfg));
 		if (!ret)
 			ret = sc2239_ioctl(sd, cmd, cfg);
+		else
+			ret = -EFAULT;
 		kfree(cfg);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		ret = copy_from_user(&stream, up, sizeof(u32));
 		if (!ret)
 			ret = sc2239_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -698,9 +709,10 @@
 	struct sc2239 *sc2239 = to_sc2239(sd);
 	const struct sc2239_mode *mode = sc2239->cur_mode;
 
-	mutex_lock(&sc2239->mutex);
-	fi->interval = mode->max_fps;
-	mutex_unlock(&sc2239->mutex);
+	if (sc2239->streaming)
+		fi->interval = sc2239->cur_fps;
+	else
+		fi->interval = mode->max_fps;
 
 	return 0;
 }
@@ -843,14 +855,14 @@
 }
 #endif
 
-static int sc2239_g_mbus_config(struct v4l2_subdev *sd,
+static int sc2239_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
 				 struct v4l2_mbus_config *config)
 {
 	u32 val = 1 << (SC2239_LANES - 1) |
 		V4L2_MBUS_CSI2_CHANNEL_0 |
 		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
 
-	config->type = V4L2_MBUS_CSI2;
+	config->type = V4L2_MBUS_CSI2_DPHY;
 	config->flags = val;
 
 	return 0;
@@ -863,8 +875,7 @@
 	if (fie->index >= ARRAY_SIZE(supported_modes))
 		return -EINVAL;
 
-	if (fie->code != PIX_FORMAT)
-		return -EINVAL;
+	fie->code = PIX_FORMAT;
 
 	fie->width = supported_modes[fie->index].width;
 	fie->height = supported_modes[fie->index].height;
@@ -894,7 +905,6 @@
 static const struct v4l2_subdev_video_ops sc2239_video_ops = {
 	.s_stream = sc2239_s_stream,
 	.g_frame_interval = sc2239_g_frame_interval,
-	.g_mbus_config = sc2239_g_mbus_config,
 };
 
 static const struct v4l2_subdev_pad_ops sc2239_pad_ops = {
@@ -903,6 +913,7 @@
 	.enum_frame_interval = sc2239_enum_frame_interval,
 	.get_fmt = sc2239_get_fmt,
 	.set_fmt = sc2239_set_fmt,
+	.get_mbus_config = sc2239_g_mbus_config,
 };
 
 static const struct v4l2_subdev_ops sc2239_subdev_ops = {
@@ -910,6 +921,14 @@
 	.video	= &sc2239_video_ops,
 	.pad	= &sc2239_pad_ops,
 };
+
+static void sc2239_modify_fps_info(struct sc2239 *sc2239)
+{
+	const struct sc2239_mode *mode = sc2239->cur_mode;
+
+	sc2239->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def /
+				      sc2239->cur_vts;
+}
 
 static int sc2239_set_ctrl(struct v4l2_ctrl *ctrl)
 {
@@ -953,6 +972,9 @@
 		ret = sc2239_write_reg(sc2239->client, SC2239_REG_VTS,
 				       SC2239_REG_VALUE_16BIT,
 				       ctrl->val + sc2239->cur_mode->height);
+		if (!ret)
+			sc2239->cur_vts = ctrl->val + sc2239->cur_mode->height;
+		sc2239_modify_fps_info(sc2239);
 		break;
 	case V4L2_CID_TEST_PATTERN:
 		ret = sc2239_enable_test_pattern(sc2239, ctrl->val);
@@ -1033,6 +1055,9 @@
 
 	sc2239->subdev.ctrl_handler = handler;
 	sc2239->old_gain = ANALOG_GAIN_DEFAULT;
+	sc2239->cur_fps = mode->max_fps;
+	sc2239->cur_vts = mode->vts_def;
+
 	return 0;
 
 err_free_handler:

--
Gitblit v1.6.2