hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/i2c/sgm3784.c
....@@ -1,5 +1,8 @@
11 // SPDX-License-Identifier: GPL-2.0
22 // Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
3
+/*
4
+ * V0.0X01.0X01 fix get wrong time info issue.
5
+ */
36
47 #include <linux/delay.h>
58 #include <linux/gpio/consumer.h>
....@@ -13,8 +16,9 @@
1316 #include <linux/version.h>
1417 #include <media/v4l2-ctrls.h>
1518 #include <media/v4l2-device.h>
19
+#include <linux/compat.h>
1620
17
-#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x0)
21
+#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x1)
1822 #define SGM3784_NAME "sgm3784"
1923
2024 #define SGM3784_REG_ID 0x00
....@@ -63,7 +67,7 @@
6367 struct v4l2_ctrl_handler ctrls;
6468 struct v4l2_ctrl *flash_brt;
6569 struct v4l2_ctrl *torch_brt;
66
- struct timeval timestamp;
70
+ struct __kernel_old_timeval timestamp;
6771 u32 max_flash_timeout;
6872 u32 max_flash_intensity;
6973 u32 max_torch_intensity;
....@@ -131,7 +135,7 @@
131135
132136 val = on ? SGM3784_ON : SGM3784_OFF;
133137 ret = sgm3784_i2c_write(flash, SGM3784_REG_ENABLE, val);
134
- flash->leds[0].timestamp = ns_to_timeval(ktime_get_ns());
138
+ flash->leds[0].timestamp = ns_to_kernel_old_timeval(ktime_get_ns());
135139 flash->leds[1].timestamp = flash->leds[0].timestamp;
136140 return ret;
137141 }
....@@ -452,53 +456,77 @@
452456 return 0;
453457 }
454458
455
-static long sgm3784_ioctl(struct v4l2_subdev *sd,
456
- unsigned int cmd, void *arg)
459
+static void sgm3784_get_time_info(struct v4l2_subdev *sd,
460
+ struct __kernel_old_timeval *ti)
457461 {
458462 struct sgm3784_led *led =
459463 container_of(sd, struct sgm3784_led, sd);
460
- struct timeval *t;
461464
465
+ memset(ti, 0, sizeof(*ti));
466
+ ti->tv_sec = led->timestamp.tv_sec;
467
+ ti->tv_usec = led->timestamp.tv_usec;
462468 v4l2_dbg(1, debug, sd,
463
- "%s: cmd 0x%x\n", __func__, cmd);
469
+ "%s: tv_sec:%ld, tv_usec:%ld\n", __func__, ti->tv_sec, ti->tv_usec);
470
+}
464471
465
- if (cmd == RK_VIDIOC_FLASH_TIMEINFO) {
466
- t = (struct timeval *)arg;
467
- t->tv_sec = led->timestamp.tv_sec;
468
- t->tv_usec = led->timestamp.tv_usec;
469
- } else {
470
- return -EINVAL;
472
+static long sgm3784_ioctl(struct v4l2_subdev *sd,
473
+ unsigned int cmd, void *arg)
474
+{
475
+ long ret = 0;
476
+
477
+ switch (cmd) {
478
+ case RK_VIDIOC_FLASH_TIMEINFO:
479
+ sgm3784_get_time_info(sd, (struct __kernel_old_timeval *)arg);
480
+ break;
481
+
482
+ default:
483
+ ret = -ENOIOCTLCMD;
484
+ break;
471485 }
472
-
473
- return 0;
486
+ return ret;
474487 }
475488
476489 #ifdef CONFIG_COMPAT
477490 #define RK_VIDIOC_COMPAT_FLASH_TIMEINFO \
478
- _IOR('V', BASE_VIDIOC_PRIVATE + 0, struct compat_timeval)
491
+ _IOR('V', BASE_VIDIOC_PRIVATE + 0, struct old_timeval32)
479492
480493 static long sgm3784_compat_ioctl32(struct v4l2_subdev *sd,
481494 unsigned int cmd,
482495 unsigned long arg)
483496 {
484
- struct timeval t;
485
- struct compat_timeval compat_t;
486
- struct compat_timeval __user *p32 = compat_ptr(arg);
497
+ void __user *up = compat_ptr(arg);
498
+ struct old_timeval32 *compat_t;
499
+ long ret;
500
+ struct __kernel_old_timeval t;
487501
488502 v4l2_dbg(1, debug, sd,
489503 "%s: cmd 0x%x\n", __func__, cmd);
490504
491
- if (cmd == RK_VIDIOC_COMPAT_FLASH_TIMEINFO) {
492
- sgm3784_ioctl(sd, RK_VIDIOC_FLASH_TIMEINFO, &t);
493
- compat_t.tv_sec = t.tv_sec;
494
- compat_t.tv_usec = t.tv_usec;
495
- put_user(compat_t.tv_sec, &p32->tv_sec);
496
- put_user(compat_t.tv_usec, &p32->tv_usec);
497
- } else {
498
- return -EINVAL;
505
+ switch (cmd) {
506
+ case RK_VIDIOC_COMPAT_FLASH_TIMEINFO:
507
+ compat_t = kzalloc(sizeof(*compat_t), GFP_KERNEL);
508
+ if (!compat_t) {
509
+ ret = -ENOMEM;
510
+ return ret;
511
+ }
512
+ ret = sgm3784_ioctl(sd, RK_VIDIOC_FLASH_TIMEINFO, &t);
513
+ if (!ret) {
514
+ compat_t->tv_sec = t.tv_sec;
515
+ compat_t->tv_usec = t.tv_usec;
516
+ ret = copy_to_user(up, compat_t, sizeof(*compat_t));
517
+ if (ret)
518
+ ret = -EFAULT;
519
+ }
520
+ kfree(compat_t);
521
+ break;
522
+
523
+ default:
524
+ ret = -ENOIOCTLCMD;
525
+ break;
499526 }
500527
501
- return 0;
528
+ return ret;
529
+
502530 }
503531 #endif
504532