From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 03 Jan 2024 09:43:39 +0000
Subject: [PATCH] update kernel to 5.10.198
---
kernel/drivers/media/i2c/fp5510.c | 32 +++++++++++++++++++++-----------
1 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/kernel/drivers/media/i2c/fp5510.c b/kernel/drivers/media/i2c/fp5510.c
index 3bf3189..5411a3e 100644
--- a/kernel/drivers/media/i2c/fp5510.c
+++ b/kernel/drivers/media/i2c/fp5510.c
@@ -15,11 +15,12 @@
#include <media/v4l2-device.h>
#include <linux/rk_vcm_head.h>
#include <linux/gpio/consumer.h>
+#include <linux/compat.h>
#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x0)
#define FP5510_NAME "fp5510"
-#define FP5510_MAX_CURRENT 100U
+#define FP5510_MAX_CURRENT 120U
#define FP5510_MAX_REG 1023U
#define FP5510_DEFAULT_START_CURRENT 0
@@ -48,8 +49,8 @@
unsigned int t_src;
unsigned int mclk;
- struct timeval start_move_tv;
- struct timeval end_move_tv;
+ struct __kernel_old_timeval start_move_tv;
+ struct __kernel_old_timeval end_move_tv;
unsigned long move_ms;
u32 module_index;
@@ -383,6 +384,8 @@
if (position > FP5510_MAX_REG)
position = FP5510_MAX_REG;
+ dev_info(&client->dev, "%s: set dest_pos %d, position %d\n", __func__, dest_pos, position);
+
dev_vcm->current_lens_pos = position;
dev_vcm->current_related_pos = dest_pos;
msb = (0x00U | ((dev_vcm->current_lens_pos & 0x3F0U) >> 4U));
@@ -437,7 +440,7 @@
(uint32_t)move_pos) /
VCMDRV_MAX_LOG);
- dev_vcm->start_move_tv = ns_to_timeval(ktime_get_ns());
+ dev_vcm->start_move_tv = ns_to_kernel_old_timeval(ktime_get_ns());
mv_us = dev_vcm->start_move_tv.tv_usec +
dev_vcm->move_ms * 1000;
if (mv_us >= 1000000) {
@@ -503,7 +506,7 @@
VCMDRV_MAX_LOG * dev_vcm->step;
dev_vcm->step_mode = dev_vcm->vcm_cfg.step_mode;
- dev_dbg(&client->dev,
+ dev_info(&client->dev,
"vcm_cfg: %d, %d, %d, max_ma %d\n",
dev_vcm->vcm_cfg.start_ma,
dev_vcm->vcm_cfg.rated_ma,
@@ -560,13 +563,15 @@
unsigned int cmd, unsigned long arg)
{
struct i2c_client *client = v4l2_get_subdevdata(sd);
- struct rk_cam_compat_vcm_tim __user *p32 = compat_ptr(arg);
+ void __user *up = compat_ptr(arg);
struct rk_cam_compat_vcm_tim compat_vcm_tim;
struct rk_cam_vcm_tim vcm_tim;
struct rk_cam_vcm_cfg vcm_cfg;
long ret;
if (cmd == RK_VIDIOC_COMPAT_VCM_TIMEINFO) {
+ struct rk_cam_compat_vcm_tim __user *p32 = up;
+
ret = fp5510_ioctl(sd, RK_VIDIOC_VCM_TIMEINFO, &vcm_tim);
compat_vcm_tim.vcm_start_t.tv_sec = vcm_tim.vcm_start_t.tv_sec;
compat_vcm_tim.vcm_start_t.tv_usec =
@@ -584,12 +589,17 @@
&p32->vcm_end_t.tv_usec);
} else if (cmd == RK_VIDIOC_GET_VCM_CFG) {
ret = fp5510_ioctl(sd, RK_VIDIOC_GET_VCM_CFG, &vcm_cfg);
- if (!ret)
+ if (!ret) {
ret = copy_to_user(up, &vcm_cfg, sizeof(vcm_cfg));
+ if (ret)
+ ret = -EFAULT;
+ }
} else if (cmd == RK_VIDIOC_SET_VCM_CFG) {
ret = copy_from_user(&vcm_cfg, up, sizeof(vcm_cfg));
if (!ret)
ret = fp5510_ioctl(sd, cmd, &vcm_cfg);
+ else
+ ret = -EFAULT;
} else {
dev_err(&client->dev,
"cmd 0x%x not supported\n", cmd);
@@ -742,8 +752,8 @@
fp5510_update_vcm_cfg(fp5510_dev);
fp5510_dev->move_ms = 0;
fp5510_dev->current_related_pos = VCMDRV_MAX_LOG;
- fp5510_dev->start_move_tv = ns_to_timeval(ktime_get_ns());
- fp5510_dev->end_move_tv = ns_to_timeval(ktime_get_ns());
+ fp5510_dev->start_move_tv = ns_to_kernel_old_timeval(ktime_get_ns());
+ fp5510_dev->end_move_tv = ns_to_kernel_old_timeval(ktime_get_ns());
/*
* Note:
* 1. At ESC mode, ESC code=1 and TSC must be equal 0.
@@ -808,7 +818,7 @@
return 0;
}
-static int fp5510_vcm_resume(struct device *dev)
+static int __maybe_unused fp5510_vcm_resume(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct v4l2_subdev *sd = i2c_get_clientdata(client);
@@ -820,7 +830,7 @@
return 0;
}
-static int fp5510_vcm_suspend(struct device *dev)
+static int __maybe_unused fp5510_vcm_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct v4l2_subdev *sd = i2c_get_clientdata(client);
--
Gitblit v1.6.2