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/sc2239.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 34 insertions(+), 9 deletions(-) diff --git a/kernel/drivers/media/i2c/sc2239.c b/kernel/drivers/media/i2c/sc2239.c index 30dba3b..f56fe45 100644 --- a/kernel/drivers/media/i2c/sc2239.c +++ b/kernel/drivers/media/i2c/sc2239.c @@ -118,6 +118,8 @@ struct v4l2_ctrl *vblank; struct v4l2_ctrl *test_pattern; struct mutex mutex; + struct v4l2_fract cur_fps; + u32 cur_vts; bool streaming; bool power_on; const struct sc2239_mode *cur_mode; @@ -406,6 +408,8 @@ __v4l2_ctrl_modify_range(sc2239->vblank, vblank_def, SC2239_VTS_MAX - mode->height, 1, vblank_def); + sc2239->cur_fps = mode->max_fps; + sc2239->cur_vts = mode->vts_def; } mutex_unlock(&sc2239->mutex); @@ -542,8 +546,11 @@ } ret = sc2239_ioctl(sd, cmd, inf); - if (!ret) + if (!ret) { ret = copy_to_user(up, inf, sizeof(*inf)); + if (ret) + ret = -EFAULT; + } kfree(inf); break; case RKMODULE_AWB_CFG: @@ -556,12 +563,16 @@ ret = copy_from_user(cfg, up, sizeof(*cfg)); if (!ret) ret = sc2239_ioctl(sd, cmd, cfg); + else + ret = -EFAULT; kfree(cfg); break; case RKMODULE_SET_QUICK_STREAM: ret = copy_from_user(&stream, up, sizeof(u32)); if (!ret) ret = sc2239_ioctl(sd, cmd, &stream); + else + ret = -EFAULT; break; default: ret = -ENOIOCTLCMD; @@ -698,9 +709,10 @@ struct sc2239 *sc2239 = to_sc2239(sd); const struct sc2239_mode *mode = sc2239->cur_mode; - mutex_lock(&sc2239->mutex); - fi->interval = mode->max_fps; - mutex_unlock(&sc2239->mutex); + if (sc2239->streaming) + fi->interval = sc2239->cur_fps; + else + fi->interval = mode->max_fps; return 0; } @@ -843,14 +855,14 @@ } #endif -static int sc2239_g_mbus_config(struct v4l2_subdev *sd, +static int sc2239_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id, struct v4l2_mbus_config *config) { u32 val = 1 << (SC2239_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; @@ -863,8 +875,7 @@ if (fie->index >= ARRAY_SIZE(supported_modes)) return -EINVAL; - if (fie->code != PIX_FORMAT) - return -EINVAL; + fie->code = PIX_FORMAT; fie->width = supported_modes[fie->index].width; fie->height = supported_modes[fie->index].height; @@ -894,7 +905,6 @@ static const struct v4l2_subdev_video_ops sc2239_video_ops = { .s_stream = sc2239_s_stream, .g_frame_interval = sc2239_g_frame_interval, - .g_mbus_config = sc2239_g_mbus_config, }; static const struct v4l2_subdev_pad_ops sc2239_pad_ops = { @@ -903,6 +913,7 @@ .enum_frame_interval = sc2239_enum_frame_interval, .get_fmt = sc2239_get_fmt, .set_fmt = sc2239_set_fmt, + .get_mbus_config = sc2239_g_mbus_config, }; static const struct v4l2_subdev_ops sc2239_subdev_ops = { @@ -910,6 +921,14 @@ .video = &sc2239_video_ops, .pad = &sc2239_pad_ops, }; + +static void sc2239_modify_fps_info(struct sc2239 *sc2239) +{ + const struct sc2239_mode *mode = sc2239->cur_mode; + + sc2239->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / + sc2239->cur_vts; +} static int sc2239_set_ctrl(struct v4l2_ctrl *ctrl) { @@ -953,6 +972,9 @@ ret = sc2239_write_reg(sc2239->client, SC2239_REG_VTS, SC2239_REG_VALUE_16BIT, ctrl->val + sc2239->cur_mode->height); + if (!ret) + sc2239->cur_vts = ctrl->val + sc2239->cur_mode->height; + sc2239_modify_fps_info(sc2239); break; case V4L2_CID_TEST_PATTERN: ret = sc2239_enable_test_pattern(sc2239, ctrl->val); @@ -1033,6 +1055,9 @@ sc2239->subdev.ctrl_handler = handler; sc2239->old_gain = ANALOG_GAIN_DEFAULT; + sc2239->cur_fps = mode->max_fps; + sc2239->cur_vts = mode->vts_def; + return 0; err_free_handler: -- Gitblit v1.6.2