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/imx214.c |   45 ++++++++++++++++++++++++++++++++++++---------
 1 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/kernel/drivers/media/i2c/imx214.c b/kernel/drivers/media/i2c/imx214.c
index 3953acc..b64fe65 100644
--- a/kernel/drivers/media/i2c/imx214.c
+++ b/kernel/drivers/media/i2c/imx214.c
@@ -872,9 +872,7 @@
 	struct imx214 *imx214 = to_imx214(sd);
 	const struct imx214_mode *mode = imx214->cur_mode;
 
-	mutex_lock(&imx214->mutex);
 	fi->interval = mode->max_fps;
-	mutex_unlock(&imx214->mutex);
 
 	return 0;
 }
@@ -1445,9 +1443,7 @@
 	if (fie->index >= imx214->cfg_num)
 		return -EINVAL;
 
-	if (fie->code != IMX214_MEDIA_BUS_FMT)
-		return -EINVAL;
-
+	fie->code = IMX214_MEDIA_BUS_FMT;
 	fie->width = imx214->support_modes[fie->index].width;
 	fie->height = imx214->support_modes[fie->index].height;
 	fie->interval = imx214->support_modes[fie->index].max_fps;
@@ -1455,7 +1451,7 @@
 	return 0;
 }
 
-static int imx214_g_mbus_config(struct v4l2_subdev *sd,
+static int imx214_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
 				struct v4l2_mbus_config *config)
 {
 	struct imx214 *imx214 = to_imx214(sd);
@@ -1466,10 +1462,40 @@
 		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;
+}
+
+#define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
+#define DST_WIDTH_2096 2096
+#define DST_HEIGHT_1560 1560
+
+static int imx214_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_pad_config *cfg,
+				struct v4l2_subdev_selection *sel)
+{
+	struct imx214 *imx214 = to_imx214(sd);
+
+	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		if (imx214->cur_mode->width == 2104) {
+			sel->r.left = CROP_START(imx214->cur_mode->width, DST_WIDTH_2096);
+			sel->r.width = DST_WIDTH_2096;
+			sel->r.top = CROP_START(imx214->cur_mode->height, DST_HEIGHT_1560);
+			sel->r.height = DST_HEIGHT_1560;
+		} else {
+			sel->r.left = CROP_START(imx214->cur_mode->width,
+							imx214->cur_mode->width);
+			sel->r.width = imx214->cur_mode->width;
+			sel->r.top = CROP_START(imx214->cur_mode->height,
+							imx214->cur_mode->height);
+			sel->r.height = imx214->cur_mode->height;
+		}
+		return 0;
+	}
+
+	return -EINVAL;
 }
 
 static const struct dev_pm_ops imx214_pm_ops = {
@@ -1494,7 +1520,6 @@
 static const struct v4l2_subdev_video_ops imx214_video_ops = {
 	.s_stream = imx214_s_stream,
 	.g_frame_interval = imx214_g_frame_interval,
-	.g_mbus_config = imx214_g_mbus_config,
 };
 
 static const struct v4l2_subdev_pad_ops imx214_pad_ops = {
@@ -1503,6 +1528,8 @@
 	.enum_frame_interval = imx214_enum_frame_interval,
 	.get_fmt = imx214_get_fmt,
 	.set_fmt = imx214_set_fmt,
+	.get_selection = imx214_get_selection,
+	.get_mbus_config = imx214_g_mbus_config,
 };
 
 static const struct v4l2_subdev_ops imx214_subdev_ops = {
@@ -1944,4 +1971,4 @@
 module_exit(sensor_mod_exit);
 
 MODULE_DESCRIPTION("Sony  imx214 sensor driver");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");

--
Gitblit v1.6.2