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/it6616.c |   69 +++++++++++++---------------------
 1 files changed, 27 insertions(+), 42 deletions(-)

diff --git a/kernel/drivers/media/i2c/it6616.c b/kernel/drivers/media/i2c/it6616.c
index 6928a11..22c610f 100644
--- a/kernel/drivers/media/i2c/it6616.c
+++ b/kernel/drivers/media/i2c/it6616.c
@@ -20,6 +20,7 @@
 #include <linux/module.h>
 #include <linux/of_graph.h>
 #include <linux/rk-camera-module.h>
+#include <linux/rk_hdmirx_class.h>
 #include <linux/slab.h>
 #include <linux/timer.h>
 #include <linux/v4l2-dv-timings.h>
@@ -471,7 +472,6 @@
 	struct regmap *mipi_regmap;
 	struct regmap *edid_regmap;
 	u8 attr_hdmi_reg_bank;
-	struct class *hdmirx_class;
 	struct device *dev;
 	struct device *classdev;
 	struct v4l2_fwnode_bus_mipi_csi2 bus;
@@ -3519,6 +3519,16 @@
 	return 0;
 }
 
+static void it6616_detect_hot_plug(struct v4l2_subdev *sd)
+{
+	struct it6616 *it6616 = to_it6616(sd);
+
+	if (it6616->mipi_tx_video_stable && it6616_hdmi_is_5v_on(it6616))
+		v4l2_ctrl_s_ctrl(it6616->detect_tx_5v_ctrl, 1);
+	else
+		v4l2_ctrl_s_ctrl(it6616->detect_tx_5v_ctrl, 0);
+}
+
 static void it6616_work_i2c_poll(struct work_struct *work)
 {
 	struct delayed_work *dwork = to_delayed_work(work);
@@ -3526,8 +3536,8 @@
 			struct it6616, work_i2c_poll);
 	bool handled;
 
-	it6616_s_ctrl_detect_tx_5v(&it6616->sd);
 	it6616_isr(&it6616->sd, 0, &handled);
+	it6616_detect_hot_plug(&it6616->sd);
 	schedule_delayed_work(&it6616->work_i2c_poll,
 			msecs_to_jiffies(POLL_INTERVAL_MS));
 }
@@ -4212,54 +4222,29 @@
 static DEVICE_ATTR_RO(audio_present);
 static DEVICE_ATTR_RO(audio_rate);
 
+static struct attribute *it6616_audio_attrs[] = {
+	&dev_attr_audio_rate.attr,
+	&dev_attr_audio_present.attr,
+	NULL
+};
+ATTRIBUTE_GROUPS(it6616_audio);
+
 static int it6616_create_class_attr(struct it6616 *it6616)
 {
-	int ret = 0;
-
-	it6616->hdmirx_class = class_create(THIS_MODULE, "hdmirx_it6616");
-	if (IS_ERR(it6616->hdmirx_class)) {
-		ret = -ENOMEM;
-		dev_err(it6616->dev, "failed to create hdmirx_it6616 class!\n");
-		return ret;
-	}
-
-	it6616->classdev = device_create(it6616->hdmirx_class, NULL,
-					MKDEV(0, 0), NULL, "hdmirx_it6616");
-	if (IS_ERR(it6616->classdev)) {
-		ret = PTR_ERR(it6616->classdev);
-		dev_err(it6616->dev, "Failed to create device\n");
-		goto err1;
-	}
-
-	ret = device_create_file(it6616->classdev,
-				&dev_attr_audio_present);
-	if (ret) {
-		dev_err(it6616->dev, "failed to create attr audio_present!\n");
-		goto err1;
-	}
-
-	ret = device_create_file(it6616->classdev,
-				&dev_attr_audio_rate);
-	if (ret) {
-		dev_err(it6616->dev,
-			"failed to create attr audio_rate!\n");
-		goto err;
-	}
-
-	return ret;
-
-err:
-	device_remove_file(it6616->classdev, &dev_attr_audio_present);
-err1:
-	class_destroy(it6616->hdmirx_class);
-	return ret;
+	it6616->classdev = device_create_with_groups(rk_hdmirx_class(),
+						     it6616->dev, MKDEV(0, 0),
+						     it6616,
+						     it6616_audio_groups,
+						     "it6616");
+	if (IS_ERR(it6616->classdev))
+		return IS_ERR(it6616->classdev);
+	return 0;
 }
 
 static void it6616_remove_class_attr(struct it6616 *it6616)
 {
 	device_remove_file(it6616->classdev, &dev_attr_audio_rate);
 	device_remove_file(it6616->classdev, &dev_attr_audio_present);
-	class_destroy(it6616->hdmirx_class);
 }
 
 static int it6616_probe(struct i2c_client *client,

--
Gitblit v1.6.2