forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/media/i2c/sc2239.c
....@@ -118,6 +118,8 @@
118118 struct v4l2_ctrl *vblank;
119119 struct v4l2_ctrl *test_pattern;
120120 struct mutex mutex;
121
+ struct v4l2_fract cur_fps;
122
+ u32 cur_vts;
121123 bool streaming;
122124 bool power_on;
123125 const struct sc2239_mode *cur_mode;
....@@ -406,6 +408,8 @@
406408 __v4l2_ctrl_modify_range(sc2239->vblank, vblank_def,
407409 SC2239_VTS_MAX - mode->height,
408410 1, vblank_def);
411
+ sc2239->cur_fps = mode->max_fps;
412
+ sc2239->cur_vts = mode->vts_def;
409413 }
410414
411415 mutex_unlock(&sc2239->mutex);
....@@ -542,8 +546,11 @@
542546 }
543547
544548 ret = sc2239_ioctl(sd, cmd, inf);
545
- if (!ret)
549
+ if (!ret) {
546550 ret = copy_to_user(up, inf, sizeof(*inf));
551
+ if (ret)
552
+ ret = -EFAULT;
553
+ }
547554 kfree(inf);
548555 break;
549556 case RKMODULE_AWB_CFG:
....@@ -556,12 +563,16 @@
556563 ret = copy_from_user(cfg, up, sizeof(*cfg));
557564 if (!ret)
558565 ret = sc2239_ioctl(sd, cmd, cfg);
566
+ else
567
+ ret = -EFAULT;
559568 kfree(cfg);
560569 break;
561570 case RKMODULE_SET_QUICK_STREAM:
562571 ret = copy_from_user(&stream, up, sizeof(u32));
563572 if (!ret)
564573 ret = sc2239_ioctl(sd, cmd, &stream);
574
+ else
575
+ ret = -EFAULT;
565576 break;
566577 default:
567578 ret = -ENOIOCTLCMD;
....@@ -698,9 +709,10 @@
698709 struct sc2239 *sc2239 = to_sc2239(sd);
699710 const struct sc2239_mode *mode = sc2239->cur_mode;
700711
701
- mutex_lock(&sc2239->mutex);
702
- fi->interval = mode->max_fps;
703
- mutex_unlock(&sc2239->mutex);
712
+ if (sc2239->streaming)
713
+ fi->interval = sc2239->cur_fps;
714
+ else
715
+ fi->interval = mode->max_fps;
704716
705717 return 0;
706718 }
....@@ -843,14 +855,14 @@
843855 }
844856 #endif
845857
846
-static int sc2239_g_mbus_config(struct v4l2_subdev *sd,
858
+static int sc2239_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
847859 struct v4l2_mbus_config *config)
848860 {
849861 u32 val = 1 << (SC2239_LANES - 1) |
850862 V4L2_MBUS_CSI2_CHANNEL_0 |
851863 V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
852864
853
- config->type = V4L2_MBUS_CSI2;
865
+ config->type = V4L2_MBUS_CSI2_DPHY;
854866 config->flags = val;
855867
856868 return 0;
....@@ -863,8 +875,7 @@
863875 if (fie->index >= ARRAY_SIZE(supported_modes))
864876 return -EINVAL;
865877
866
- if (fie->code != PIX_FORMAT)
867
- return -EINVAL;
878
+ fie->code = PIX_FORMAT;
868879
869880 fie->width = supported_modes[fie->index].width;
870881 fie->height = supported_modes[fie->index].height;
....@@ -894,7 +905,6 @@
894905 static const struct v4l2_subdev_video_ops sc2239_video_ops = {
895906 .s_stream = sc2239_s_stream,
896907 .g_frame_interval = sc2239_g_frame_interval,
897
- .g_mbus_config = sc2239_g_mbus_config,
898908 };
899909
900910 static const struct v4l2_subdev_pad_ops sc2239_pad_ops = {
....@@ -903,6 +913,7 @@
903913 .enum_frame_interval = sc2239_enum_frame_interval,
904914 .get_fmt = sc2239_get_fmt,
905915 .set_fmt = sc2239_set_fmt,
916
+ .get_mbus_config = sc2239_g_mbus_config,
906917 };
907918
908919 static const struct v4l2_subdev_ops sc2239_subdev_ops = {
....@@ -910,6 +921,14 @@
910921 .video = &sc2239_video_ops,
911922 .pad = &sc2239_pad_ops,
912923 };
924
+
925
+static void sc2239_modify_fps_info(struct sc2239 *sc2239)
926
+{
927
+ const struct sc2239_mode *mode = sc2239->cur_mode;
928
+
929
+ sc2239->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def /
930
+ sc2239->cur_vts;
931
+}
913932
914933 static int sc2239_set_ctrl(struct v4l2_ctrl *ctrl)
915934 {
....@@ -953,6 +972,9 @@
953972 ret = sc2239_write_reg(sc2239->client, SC2239_REG_VTS,
954973 SC2239_REG_VALUE_16BIT,
955974 ctrl->val + sc2239->cur_mode->height);
975
+ if (!ret)
976
+ sc2239->cur_vts = ctrl->val + sc2239->cur_mode->height;
977
+ sc2239_modify_fps_info(sc2239);
956978 break;
957979 case V4L2_CID_TEST_PATTERN:
958980 ret = sc2239_enable_test_pattern(sc2239, ctrl->val);
....@@ -1033,6 +1055,9 @@
10331055
10341056 sc2239->subdev.ctrl_handler = handler;
10351057 sc2239->old_gain = ANALOG_GAIN_DEFAULT;
1058
+ sc2239->cur_fps = mode->max_fps;
1059
+ sc2239->cur_vts = mode->vts_def;
1060
+
10361061 return 0;
10371062
10381063 err_free_handler: