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/ov5670.c | 91 ++++++++++++++++++--------------------------- 1 files changed, 36 insertions(+), 55 deletions(-) diff --git a/kernel/drivers/media/i2c/ov5670.c b/kernel/drivers/media/i2c/ov5670.c index 3e244b6..16425ff 100644 --- a/kernel/drivers/media/i2c/ov5670.c +++ b/kernel/drivers/media/i2c/ov5670.c @@ -8,8 +8,6 @@ * V0.0X01.0X02 fix mclk issue when probe multiple camera. * V0.0X01.0X03 add otp function. * V0.0X01.0X04 add enum_frame_interval function. - * V0.0X01.0X05 add quick stream on/off - * V0.0X01.0X06 add function g_mmbus_config */ #include <linux/clk.h> @@ -39,9 +37,9 @@ #include <linux/rk-camera-module.h> /* verify default register values */ -//#define CHECK_REG_VALUE +#define CHECK_REG_VALUE -#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x06) +#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x04) #ifndef V4L2_CID_DIGITAL_GAIN #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN @@ -543,7 +541,6 @@ {0x5045, 0x05}, //[2] enable MWB manual bias {0x5048, 0x10}, //MWB manual bias be the same with 0x4003 BLC target. //{0x0100, 0x01}, - {REG_NULL, 0x00}, }; @@ -932,14 +929,14 @@ if (ov5670_module_info[i].id == otp->module_id) break; } - strlcpy(inf->fac.module, ov5670_module_info[i].name, + strscpy(inf->fac.module, ov5670_module_info[i].name, sizeof(inf->fac.module)); for (i = 0; i < ARRAY_SIZE(ov5670_lens_info) - 1; i++) { if (ov5670_lens_info[i].id == otp->lens_id) break; } - strlcpy(inf->fac.lens, ov5670_lens_info[i].name, + strscpy(inf->fac.lens, ov5670_lens_info[i].name, sizeof(inf->fac.lens)); } @@ -978,11 +975,12 @@ struct rkmodule_inf *inf) { struct ov5670_otp_info *otp = ov5670->otp; + memset(inf, 0, sizeof(*inf)); - strlcpy(inf->base.sensor, OV5670_NAME, sizeof(inf->base.sensor)); - strlcpy(inf->base.module, ov5670->module_name, + strscpy(inf->base.sensor, OV5670_NAME, sizeof(inf->base.sensor)); + strscpy(inf->base.module, ov5670->module_name, sizeof(inf->base.module)); - strlcpy(inf->base.lens, ov5670->len_name, sizeof(inf->base.lens)); + strscpy(inf->base.lens, ov5670->len_name, sizeof(inf->base.lens)); if (otp) ov5670_get_otp(otp, inf); } @@ -999,7 +997,6 @@ { struct ov5670 *ov5670 = to_ov5670(sd); long ret = 0; - u32 stream = 0; switch (cmd) { case RKMODULE_GET_MODULE_INFO: @@ -1007,17 +1004,6 @@ break; case RKMODULE_AWB_CFG: ov5670_set_awb_cfg(ov5670, (struct rkmodule_awb_cfg *)arg); - break; - case RKMODULE_SET_QUICK_STREAM: - - stream = *((u32 *)arg); - - if (stream) - ret = ov5670_write_reg(ov5670->client, OV5670_REG_CTRL_MODE, - OV5670_REG_VALUE_08BIT, OV5670_MODE_STREAMING); - else - ret = ov5670_write_reg(ov5670->client, OV5670_REG_CTRL_MODE, - OV5670_REG_VALUE_08BIT, OV5670_MODE_SW_STANDBY); break; default: ret = -ENOIOCTLCMD; @@ -1035,7 +1021,6 @@ struct rkmodule_inf *inf; struct rkmodule_awb_cfg *awb_cfg; long ret; - u32 stream = 0; switch (cmd) { case RKMODULE_GET_MODULE_INFO: @@ -1046,8 +1031,10 @@ } ret = ov5670_ioctl(sd, cmd, inf); - if (!ret) - ret = copy_to_user(up, inf, sizeof(*inf)); + if (!ret) { + if (copy_to_user(up, inf, sizeof(*inf))) + return -EFAULT; + } kfree(inf); break; case RKMODULE_AWB_CFG: @@ -1057,15 +1044,11 @@ return ret; } - ret = copy_from_user(awb_cfg, up, sizeof(*awb_cfg)); - if (!ret) - ret = ov5670_ioctl(sd, cmd, awb_cfg); + if (copy_from_user(awb_cfg, up, sizeof(*awb_cfg))) + return -EFAULT; + + ret = ov5670_ioctl(sd, cmd, awb_cfg); kfree(awb_cfg); - break; - case RKMODULE_SET_QUICK_STREAM: - ret = copy_from_user(&stream, up, sizeof(u32)); - if (!ret) - ret = ov5670_ioctl(sd, cmd, &stream); break; default: ret = -ENOIOCTLCMD; @@ -1075,6 +1058,7 @@ return ret; } #endif + /*--------------------------------------------------------------------------*/ static int ov5670_apply_otp(struct ov5670 *ov5670) { @@ -1195,8 +1179,8 @@ int ret = 0; dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on, - ov5670->cur_mode->width, - ov5670->cur_mode->height, + ov5670->cur_mode->width, + ov5670->cur_mode->height, DIV_ROUND_CLOSEST(ov5670->cur_mode->max_fps.denominator, ov5670->cur_mode->max_fps.numerator)); @@ -1414,9 +1398,7 @@ if (fie->index >= ov5670->cfg_num) return -EINVAL; - if (fie->code != MEDIA_BUS_FMT_SBGGR10_1X10) - return -EINVAL; - + fie->code = MEDIA_BUS_FMT_SBGGR10_1X10; fie->width = supported_modes[fie->index].width; fie->height = supported_modes[fie->index].height; fie->interval = supported_modes[fie->index].max_fps; @@ -1424,14 +1406,14 @@ } static int ov5670_g_mbus_config(struct v4l2_subdev *sd, + unsigned int pad_id, struct v4l2_mbus_config *config) { - u32 val = 0; + u32 val = 1 << (OV5670_LANES - 1) | + V4L2_MBUS_CSI2_CHANNEL_0 | + V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; - val = 1 << (OV5670_LANES - 1) | - V4L2_MBUS_CSI2_CHANNEL_0 | - V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; - config->type = V4L2_MBUS_CSI2; + config->type = V4L2_MBUS_CSI2_DPHY; config->flags = val; return 0; @@ -1459,7 +1441,6 @@ static const struct v4l2_subdev_video_ops ov5670_video_ops = { .s_stream = ov5670_s_stream, .g_frame_interval = ov5670_g_frame_interval, - .g_mbus_config = ov5670_g_mbus_config, }; static const struct v4l2_subdev_pad_ops ov5670_pad_ops = { @@ -1468,6 +1449,7 @@ .enum_frame_interval = ov5670_enum_frame_interval, .get_fmt = ov5670_get_fmt, .set_fmt = ov5670_set_fmt, + .get_mbus_config = ov5670_g_mbus_config, }; static const struct v4l2_subdev_ops ov5670_subdev_ops = { @@ -1496,7 +1478,7 @@ break; } - if (!pm_runtime_get_if_in_use(&client->dev)) + if (pm_runtime_get(&client->dev) <= 0) return 0; switch (ctrl->id) { @@ -1505,11 +1487,11 @@ /*group 0*/ ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, OV5670_REG_VALUE_08BIT, 0x00); - ret = ov5670_write_reg(ov5670->client, OV5670_REG_EXPOSURE, + ret |= ov5670_write_reg(ov5670->client, OV5670_REG_EXPOSURE, OV5670_REG_VALUE_24BIT, ctrl->val << 4); - ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, + ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, OV5670_REG_VALUE_08BIT, 0x10); - ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, + ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, OV5670_REG_VALUE_08BIT, 0xa0); break; @@ -1518,16 +1500,16 @@ ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, OV5670_REG_VALUE_08BIT, 0x01); - ret = ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_L, + ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_L, OV5670_REG_VALUE_08BIT, ctrl->val & OV5670_GAIN_L_MASK); ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GAIN_H, OV5670_REG_VALUE_08BIT, (ctrl->val >> OV5670_GAIN_H_SHIFT) & OV5670_GAIN_H_MASK); - ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, + ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, OV5670_REG_VALUE_08BIT, 0x11); - ret = ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, + ret |= ov5670_write_reg(ov5670->client, OV5670_REG_GROUP, OV5670_REG_VALUE_08BIT, 0xa1); break; case V4L2_CID_VBLANK: @@ -1625,7 +1607,7 @@ static int ov5670_otp_read(struct ov5670 *ov5670) { - int otp_flag, addr, temp, i; + int otp_flag, addr, temp = 0, i; struct ov5670_otp_info *otp_ptr; struct device *dev = &ov5670->client->dev; struct i2c_client *client = ov5670->client; @@ -1804,7 +1786,7 @@ } ov5670->lane_num = rval; - if (2 == ov5670->lane_num) { + if (ov5670->lane_num == 2) { ov5670->cur_mode = &supported_modes_2lane[0]; supported_modes = supported_modes_2lane; ov5670->cfg_num = ARRAY_SIZE(supported_modes_2lane); @@ -1925,8 +1907,7 @@ #ifdef CONFIG_VIDEO_V4L2_SUBDEV_API sd->internal_ops = &ov5670_internal_ops; - sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | - V4L2_SUBDEV_FL_HAS_EVENTS; + sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; #endif #if defined(CONFIG_MEDIA_CONTROLLER) ov5670->pad.flags = MEDIA_PAD_FL_SOURCE; -- Gitblit v1.6.2