hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/i2c/ov5670.c
....@@ -8,8 +8,6 @@
88 * V0.0X01.0X02 fix mclk issue when probe multiple camera.
99 * V0.0X01.0X03 add otp function.
1010 * V0.0X01.0X04 add enum_frame_interval function.
11
- * V0.0X01.0X05 add quick stream on/off
12
- * V0.0X01.0X06 add function g_mmbus_config
1311 */
1412
1513 #include <linux/clk.h>
....@@ -39,9 +37,9 @@
3937 #include <linux/rk-camera-module.h>
4038
4139 /* verify default register values */
42
-//#define CHECK_REG_VALUE
40
+#define CHECK_REG_VALUE
4341
44
-#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x06)
42
+#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x04)
4543
4644 #ifndef V4L2_CID_DIGITAL_GAIN
4745 #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN
....@@ -543,7 +541,6 @@
543541 {0x5045, 0x05}, //[2] enable MWB manual bias
544542 {0x5048, 0x10}, //MWB manual bias be the same with 0x4003 BLC target.
545543 //{0x0100, 0x01},
546
-
547544 {REG_NULL, 0x00},
548545 };
549546
....@@ -932,14 +929,14 @@
932929 if (ov5670_module_info[i].id == otp->module_id)
933930 break;
934931 }
935
- strlcpy(inf->fac.module, ov5670_module_info[i].name,
932
+ strscpy(inf->fac.module, ov5670_module_info[i].name,
936933 sizeof(inf->fac.module));
937934
938935 for (i = 0; i < ARRAY_SIZE(ov5670_lens_info) - 1; i++) {
939936 if (ov5670_lens_info[i].id == otp->lens_id)
940937 break;
941938 }
942
- strlcpy(inf->fac.lens, ov5670_lens_info[i].name,
939
+ strscpy(inf->fac.lens, ov5670_lens_info[i].name,
943940 sizeof(inf->fac.lens));
944941 }
945942
....@@ -978,11 +975,12 @@
978975 struct rkmodule_inf *inf)
979976 {
980977 struct ov5670_otp_info *otp = ov5670->otp;
978
+
981979 memset(inf, 0, sizeof(*inf));
982
- strlcpy(inf->base.sensor, OV5670_NAME, sizeof(inf->base.sensor));
983
- strlcpy(inf->base.module, ov5670->module_name,
980
+ strscpy(inf->base.sensor, OV5670_NAME, sizeof(inf->base.sensor));
981
+ strscpy(inf->base.module, ov5670->module_name,
984982 sizeof(inf->base.module));
985
- strlcpy(inf->base.lens, ov5670->len_name, sizeof(inf->base.lens));
983
+ strscpy(inf->base.lens, ov5670->len_name, sizeof(inf->base.lens));
986984 if (otp)
987985 ov5670_get_otp(otp, inf);
988986 }
....@@ -999,7 +997,6 @@
999997 {
1000998 struct ov5670 *ov5670 = to_ov5670(sd);
1001999 long ret = 0;
1002
- u32 stream = 0;
10031000
10041001 switch (cmd) {
10051002 case RKMODULE_GET_MODULE_INFO:
....@@ -1007,17 +1004,6 @@
10071004 break;
10081005 case RKMODULE_AWB_CFG:
10091006 ov5670_set_awb_cfg(ov5670, (struct rkmodule_awb_cfg *)arg);
1010
- break;
1011
- case RKMODULE_SET_QUICK_STREAM:
1012
-
1013
- stream = *((u32 *)arg);
1014
-
1015
- if (stream)
1016
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_CTRL_MODE,
1017
- OV5670_REG_VALUE_08BIT, OV5670_MODE_STREAMING);
1018
- else
1019
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_CTRL_MODE,
1020
- OV5670_REG_VALUE_08BIT, OV5670_MODE_SW_STANDBY);
10211007 break;
10221008 default:
10231009 ret = -ENOIOCTLCMD;
....@@ -1035,7 +1021,6 @@
10351021 struct rkmodule_inf *inf;
10361022 struct rkmodule_awb_cfg *awb_cfg;
10371023 long ret;
1038
- u32 stream = 0;
10391024
10401025 switch (cmd) {
10411026 case RKMODULE_GET_MODULE_INFO:
....@@ -1046,8 +1031,10 @@
10461031 }
10471032
10481033 ret = ov5670_ioctl(sd, cmd, inf);
1049
- if (!ret)
1050
- ret = copy_to_user(up, inf, sizeof(*inf));
1034
+ if (!ret) {
1035
+ if (copy_to_user(up, inf, sizeof(*inf)))
1036
+ return -EFAULT;
1037
+ }
10511038 kfree(inf);
10521039 break;
10531040 case RKMODULE_AWB_CFG:
....@@ -1057,15 +1044,11 @@
10571044 return ret;
10581045 }
10591046
1060
- ret = copy_from_user(awb_cfg, up, sizeof(*awb_cfg));
1061
- if (!ret)
1062
- ret = ov5670_ioctl(sd, cmd, awb_cfg);
1047
+ if (copy_from_user(awb_cfg, up, sizeof(*awb_cfg)))
1048
+ return -EFAULT;
1049
+
1050
+ ret = ov5670_ioctl(sd, cmd, awb_cfg);
10631051 kfree(awb_cfg);
1064
- break;
1065
- case RKMODULE_SET_QUICK_STREAM:
1066
- ret = copy_from_user(&stream, up, sizeof(u32));
1067
- if (!ret)
1068
- ret = ov5670_ioctl(sd, cmd, &stream);
10691052 break;
10701053 default:
10711054 ret = -ENOIOCTLCMD;
....@@ -1075,6 +1058,7 @@
10751058 return ret;
10761059 }
10771060 #endif
1061
+
10781062 /*--------------------------------------------------------------------------*/
10791063 static int ov5670_apply_otp(struct ov5670 *ov5670)
10801064 {
....@@ -1195,8 +1179,8 @@
11951179 int ret = 0;
11961180
11971181 dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
1198
- ov5670->cur_mode->width,
1199
- ov5670->cur_mode->height,
1182
+ ov5670->cur_mode->width,
1183
+ ov5670->cur_mode->height,
12001184 DIV_ROUND_CLOSEST(ov5670->cur_mode->max_fps.denominator,
12011185 ov5670->cur_mode->max_fps.numerator));
12021186
....@@ -1414,9 +1398,7 @@
14141398 if (fie->index >= ov5670->cfg_num)
14151399 return -EINVAL;
14161400
1417
- if (fie->code != MEDIA_BUS_FMT_SBGGR10_1X10)
1418
- return -EINVAL;
1419
-
1401
+ fie->code = MEDIA_BUS_FMT_SBGGR10_1X10;
14201402 fie->width = supported_modes[fie->index].width;
14211403 fie->height = supported_modes[fie->index].height;
14221404 fie->interval = supported_modes[fie->index].max_fps;
....@@ -1424,14 +1406,14 @@
14241406 }
14251407
14261408 static int ov5670_g_mbus_config(struct v4l2_subdev *sd,
1409
+ unsigned int pad_id,
14271410 struct v4l2_mbus_config *config)
14281411 {
1429
- u32 val = 0;
1412
+ u32 val = 1 << (OV5670_LANES - 1) |
1413
+ V4L2_MBUS_CSI2_CHANNEL_0 |
1414
+ V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
14301415
1431
- val = 1 << (OV5670_LANES - 1) |
1432
- V4L2_MBUS_CSI2_CHANNEL_0 |
1433
- V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
1434
- config->type = V4L2_MBUS_CSI2;
1416
+ config->type = V4L2_MBUS_CSI2_DPHY;
14351417 config->flags = val;
14361418
14371419 return 0;
....@@ -1459,7 +1441,6 @@
14591441 static const struct v4l2_subdev_video_ops ov5670_video_ops = {
14601442 .s_stream = ov5670_s_stream,
14611443 .g_frame_interval = ov5670_g_frame_interval,
1462
- .g_mbus_config = ov5670_g_mbus_config,
14631444 };
14641445
14651446 static const struct v4l2_subdev_pad_ops ov5670_pad_ops = {
....@@ -1468,6 +1449,7 @@
14681449 .enum_frame_interval = ov5670_enum_frame_interval,
14691450 .get_fmt = ov5670_get_fmt,
14701451 .set_fmt = ov5670_set_fmt,
1452
+ .get_mbus_config = ov5670_g_mbus_config,
14711453 };
14721454
14731455 static const struct v4l2_subdev_ops ov5670_subdev_ops = {
....@@ -1496,7 +1478,7 @@
14961478 break;
14971479 }
14981480
1499
- if (!pm_runtime_get_if_in_use(&client->dev))
1481
+ if (pm_runtime_get(&client->dev) <= 0)
15001482 return 0;
15011483
15021484 switch (ctrl->id) {
....@@ -1505,11 +1487,11 @@
15051487 /*group 0*/
15061488 ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
15071489 OV5670_REG_VALUE_08BIT, 0x00);
1508
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_EXPOSURE,
1490
+ ret |= ov5670_write_reg(ov5670->client, OV5670_REG_EXPOSURE,
15091491 OV5670_REG_VALUE_24BIT, ctrl->val << 4);
1510
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
1492
+ ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
15111493 OV5670_REG_VALUE_08BIT, 0x10);
1512
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
1494
+ ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
15131495 OV5670_REG_VALUE_08BIT, 0xa0);
15141496
15151497 break;
....@@ -1518,16 +1500,16 @@
15181500 ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
15191501 OV5670_REG_VALUE_08BIT, 0x01);
15201502
1521
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_L,
1503
+ ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_L,
15221504 OV5670_REG_VALUE_08BIT,
15231505 ctrl->val & OV5670_GAIN_L_MASK);
15241506 ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_H,
15251507 OV5670_REG_VALUE_08BIT,
15261508 (ctrl->val >> OV5670_GAIN_H_SHIFT) &
15271509 OV5670_GAIN_H_MASK);
1528
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
1510
+ ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
15291511 OV5670_REG_VALUE_08BIT, 0x11);
1530
- ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
1512
+ ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP,
15311513 OV5670_REG_VALUE_08BIT, 0xa1);
15321514 break;
15331515 case V4L2_CID_VBLANK:
....@@ -1625,7 +1607,7 @@
16251607
16261608 static int ov5670_otp_read(struct ov5670 *ov5670)
16271609 {
1628
- int otp_flag, addr, temp, i;
1610
+ int otp_flag, addr, temp = 0, i;
16291611 struct ov5670_otp_info *otp_ptr;
16301612 struct device *dev = &ov5670->client->dev;
16311613 struct i2c_client *client = ov5670->client;
....@@ -1804,7 +1786,7 @@
18041786 }
18051787
18061788 ov5670->lane_num = rval;
1807
- if (2 == ov5670->lane_num) {
1789
+ if (ov5670->lane_num == 2) {
18081790 ov5670->cur_mode = &supported_modes_2lane[0];
18091791 supported_modes = supported_modes_2lane;
18101792 ov5670->cfg_num = ARRAY_SIZE(supported_modes_2lane);
....@@ -1925,8 +1907,7 @@
19251907
19261908 #ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
19271909 sd->internal_ops = &ov5670_internal_ops;
1928
- sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
1929
- V4L2_SUBDEV_FL_HAS_EVENTS;
1910
+ sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
19301911 #endif
19311912 #if defined(CONFIG_MEDIA_CONTROLLER)
19321913 ov5670->pad.flags = MEDIA_PAD_FL_SOURCE;