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/sgm3784.c |   84 ++++++++++++++++++++++++++++--------------
 1 files changed, 56 insertions(+), 28 deletions(-)

diff --git a/kernel/drivers/media/i2c/sgm3784.c b/kernel/drivers/media/i2c/sgm3784.c
index 3f5acaf..86e3a2e 100644
--- a/kernel/drivers/media/i2c/sgm3784.c
+++ b/kernel/drivers/media/i2c/sgm3784.c
@@ -1,5 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0
 // Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
+/*
+ * V0.0X01.0X01 fix get wrong time info issue.
+ */
 
 #include <linux/delay.h>
 #include <linux/gpio/consumer.h>
@@ -13,8 +16,9 @@
 #include <linux/version.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
+#include <linux/compat.h>
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x0)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x1)
 #define SGM3784_NAME			"sgm3784"
 
 #define SGM3784_REG_ID			0x00
@@ -63,7 +67,7 @@
 	struct v4l2_ctrl_handler ctrls;
 	struct v4l2_ctrl *flash_brt;
 	struct v4l2_ctrl *torch_brt;
-	struct timeval timestamp;
+	struct __kernel_old_timeval timestamp;
 	u32 max_flash_timeout;
 	u32 max_flash_intensity;
 	u32 max_torch_intensity;
@@ -131,7 +135,7 @@
 
 	val = on ? SGM3784_ON : SGM3784_OFF;
 	ret = sgm3784_i2c_write(flash, SGM3784_REG_ENABLE, val);
-	flash->leds[0].timestamp = ns_to_timeval(ktime_get_ns());
+	flash->leds[0].timestamp = ns_to_kernel_old_timeval(ktime_get_ns());
 	flash->leds[1].timestamp = flash->leds[0].timestamp;
 	return ret;
 }
@@ -452,53 +456,77 @@
 	return 0;
 }
 
-static long sgm3784_ioctl(struct v4l2_subdev *sd,
-			 unsigned int cmd, void *arg)
+static void sgm3784_get_time_info(struct v4l2_subdev *sd,
+				  struct __kernel_old_timeval *ti)
 {
 	struct sgm3784_led *led =
 		container_of(sd, struct sgm3784_led, sd);
-	struct timeval *t;
 
+	memset(ti, 0, sizeof(*ti));
+	ti->tv_sec = led->timestamp.tv_sec;
+	ti->tv_usec = led->timestamp.tv_usec;
 	v4l2_dbg(1, debug, sd,
-		 "%s: cmd 0x%x\n", __func__, cmd);
+		 "%s: tv_sec:%ld, tv_usec:%ld\n", __func__, ti->tv_sec, ti->tv_usec);
+}
 
-	if (cmd == RK_VIDIOC_FLASH_TIMEINFO) {
-		t = (struct timeval *)arg;
-		t->tv_sec = led->timestamp.tv_sec;
-		t->tv_usec = led->timestamp.tv_usec;
-	} else {
-		return -EINVAL;
+static long sgm3784_ioctl(struct v4l2_subdev *sd,
+			 unsigned int cmd, void *arg)
+{
+	long ret = 0;
+
+	switch (cmd) {
+	case RK_VIDIOC_FLASH_TIMEINFO:
+		sgm3784_get_time_info(sd, (struct __kernel_old_timeval *)arg);
+		break;
+
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
 	}
-
-	return 0;
+	return ret;
 }
 
 #ifdef CONFIG_COMPAT
 #define RK_VIDIOC_COMPAT_FLASH_TIMEINFO \
-	_IOR('V', BASE_VIDIOC_PRIVATE + 0, struct compat_timeval)
+	_IOR('V', BASE_VIDIOC_PRIVATE + 0, struct old_timeval32)
 
 static long sgm3784_compat_ioctl32(struct v4l2_subdev *sd,
 				  unsigned int cmd,
 				  unsigned long arg)
 {
-	struct timeval t;
-	struct compat_timeval compat_t;
-	struct compat_timeval __user *p32 = compat_ptr(arg);
+	void __user *up = compat_ptr(arg);
+	struct old_timeval32 *compat_t;
+	long ret;
+	struct __kernel_old_timeval t;
 
 	v4l2_dbg(1, debug, sd,
 		 "%s: cmd 0x%x\n", __func__, cmd);
 
-	if (cmd == RK_VIDIOC_COMPAT_FLASH_TIMEINFO) {
-		sgm3784_ioctl(sd, RK_VIDIOC_FLASH_TIMEINFO, &t);
-		compat_t.tv_sec = t.tv_sec;
-		compat_t.tv_usec = t.tv_usec;
-		put_user(compat_t.tv_sec, &p32->tv_sec);
-		put_user(compat_t.tv_usec, &p32->tv_usec);
-	} else {
-		return -EINVAL;
+	switch (cmd) {
+	case RK_VIDIOC_COMPAT_FLASH_TIMEINFO:
+		compat_t = kzalloc(sizeof(*compat_t), GFP_KERNEL);
+		if (!compat_t) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = sgm3784_ioctl(sd, RK_VIDIOC_FLASH_TIMEINFO, &t);
+		if (!ret) {
+			compat_t->tv_sec = t.tv_sec;
+			compat_t->tv_usec = t.tv_usec;
+			ret = copy_to_user(up, compat_t, sizeof(*compat_t));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(compat_t);
+		break;
+
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
 	}
 
-	return 0;
+	return ret;
+
 }
 #endif
 

--
Gitblit v1.6.2