hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/drivers/media/i2c/sc2232.c
....@@ -93,14 +93,6 @@
9393
9494 #define SC2232_NUM_SUPPLIES ARRAY_SIZE(sc2232_supply_names)
9595
96
-enum sc2232_max_pad {
97
- PAD0,
98
- PAD1,
99
- PAD2,
100
- PAD3,
101
- PAD_MAX,
102
-};
103
-
10496 struct regval {
10597 u16 addr;
10698 u8 val;
....@@ -141,6 +133,7 @@
141133 struct v4l2_ctrl *pixel_rate;
142134 struct v4l2_ctrl *link_freq;
143135 struct mutex mutex;
136
+ struct v4l2_fract cur_fps;
144137 bool streaming;
145138 bool power_on;
146139 const struct sc2232_mode *cur_mode;
....@@ -518,6 +511,8 @@
518511 pixel_rate = (u32)link_freq_items[mode->mipi_freq_idx] /
519512 mode->bpp * 2 * SC2232_LANES;
520513 __v4l2_ctrl_s_ctrl_int64(sc2232->pixel_rate, pixel_rate);
514
+ sc2232->cur_fps = mode->max_fps;
515
+ sc2232->cur_vts = mode->vts_def;
521516 }
522517
523518 mutex_unlock(&sc2232->mutex);
....@@ -594,14 +589,15 @@
594589 struct sc2232 *sc2232 = to_sc2232(sd);
595590 const struct sc2232_mode *mode = sc2232->cur_mode;
596591
597
- mutex_lock(&sc2232->mutex);
598
- fi->interval = mode->max_fps;
599
- mutex_unlock(&sc2232->mutex);
592
+ if (sc2232->streaming)
593
+ fi->interval = sc2232->cur_fps;
594
+ else
595
+ fi->interval = mode->max_fps;
600596
601597 return 0;
602598 }
603599
604
-static int sc2232_g_mbus_config(struct v4l2_subdev *sd,
600
+static int sc2232_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
605601 struct v4l2_mbus_config *config)
606602 {
607603 struct sc2232 *sc2232 = to_sc2232(sd);
....@@ -618,7 +614,7 @@
618614 V4L2_MBUS_CSI2_CONTINUOUS_CLOCK |
619615 V4L2_MBUS_CSI2_CHANNEL_1;
620616
621
- config->type = V4L2_MBUS_CSI2;
617
+ config->type = V4L2_MBUS_CSI2_DPHY;
622618 config->flags = val;
623619
624620 return 0;
....@@ -803,8 +799,11 @@
803799 }
804800
805801 ret = sc2232_ioctl(sd, cmd, inf);
806
- if (!ret)
802
+ if (!ret) {
807803 ret = copy_to_user(up, inf, sizeof(*inf));
804
+ if (ret)
805
+ ret = -EFAULT;
806
+ }
808807 kfree(inf);
809808 break;
810809 case RKMODULE_AWB_CFG:
....@@ -817,6 +816,8 @@
817816 ret = copy_from_user(cfg, up, sizeof(*cfg));
818817 if (!ret)
819818 ret = sc2232_ioctl(sd, cmd, cfg);
819
+ else
820
+ ret = -EFAULT;
820821 kfree(cfg);
821822 break;
822823 case RKMODULE_GET_HDR_CFG:
....@@ -827,8 +828,11 @@
827828 }
828829
829830 ret = sc2232_ioctl(sd, cmd, hdr);
830
- if (!ret)
831
+ if (!ret) {
831832 ret = copy_to_user(up, hdr, sizeof(*hdr));
833
+ if (ret)
834
+ ret = -EFAULT;
835
+ }
832836 kfree(hdr);
833837 break;
834838 case RKMODULE_SET_HDR_CFG:
....@@ -841,6 +845,8 @@
841845 ret = copy_from_user(hdr, up, sizeof(*hdr));
842846 if (!ret)
843847 ret = sc2232_ioctl(sd, cmd, hdr);
848
+ else
849
+ ret = -EFAULT;
844850 kfree(hdr);
845851 break;
846852 case PREISP_CMD_SET_HDRAE_EXP:
....@@ -853,17 +859,23 @@
853859 ret = copy_from_user(hdrae, up, sizeof(*hdrae));
854860 if (!ret)
855861 ret = sc2232_ioctl(sd, cmd, hdrae);
862
+ else
863
+ ret = -EFAULT;
856864 kfree(hdrae);
857865 break;
858866 case RKMODULE_SET_CONVERSION_GAIN:
859867 ret = copy_from_user(&cg, up, sizeof(cg));
860868 if (!ret)
861869 ret = sc2232_ioctl(sd, cmd, &cg);
870
+ else
871
+ ret = -EFAULT;
862872 break;
863873 case RKMODULE_SET_QUICK_STREAM:
864874 ret = copy_from_user(&stream, up, sizeof(u32));
865875 if (!ret)
866876 ret = sc2232_ioctl(sd, cmd, &stream);
877
+ else
878
+ ret = -EFAULT;
867879 break;
868880 default:
869881 ret = -ENOIOCTLCMD;
....@@ -1128,7 +1140,6 @@
11281140 static const struct v4l2_subdev_video_ops sc2232_video_ops = {
11291141 .s_stream = sc2232_s_stream,
11301142 .g_frame_interval = sc2232_g_frame_interval,
1131
- .g_mbus_config = sc2232_g_mbus_config,
11321143 };
11331144
11341145 static const struct v4l2_subdev_pad_ops sc2232_pad_ops = {
....@@ -1137,6 +1148,7 @@
11371148 .enum_frame_interval = sc2232_enum_frame_interval,
11381149 .get_fmt = sc2232_get_fmt,
11391150 .set_fmt = sc2232_set_fmt,
1151
+ .get_mbus_config = sc2232_g_mbus_config,
11401152 };
11411153
11421154 static const struct v4l2_subdev_ops sc2232_subdev_ops = {
....@@ -1144,6 +1156,14 @@
11441156 .video = &sc2232_video_ops, /* */
11451157 .pad = &sc2232_pad_ops, /* */
11461158 };
1159
+
1160
+static void sc2232_modify_fps_info(struct sc2232 *sc2232)
1161
+{
1162
+ const struct sc2232_mode *mode = sc2232->cur_mode;
1163
+
1164
+ sc2232->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def /
1165
+ sc2232->cur_vts;
1166
+}
11471167
11481168 static int sc2232_set_ctrl(struct v4l2_ctrl *ctrl)
11491169 {
....@@ -1172,7 +1192,7 @@
11721192 switch (ctrl->id) {
11731193 case V4L2_CID_EXPOSURE:
11741194 if (sc2232->cur_mode->hdr_mode != NO_HDR)
1175
- return ret;
1195
+ goto ctrl_end;
11761196 val = ctrl->val << 1;
11771197 ret = sc2232_write_reg(sc2232->client,
11781198 SC2232_REG_EXP_LONG_L,
....@@ -1190,13 +1210,16 @@
11901210 break;
11911211 case V4L2_CID_ANALOGUE_GAIN:
11921212 if (sc2232->cur_mode->hdr_mode != NO_HDR)
1193
- return ret;
1213
+ goto ctrl_end;
11941214 ret = sc2232_set_gain(sc2232, ctrl->val);
11951215 break;
11961216 case V4L2_CID_VBLANK:
11971217 ret = sc2232_write_reg(sc2232->client, SC2232_REG_VTS,
11981218 SC2232_REG_VALUE_16BIT,
11991219 ctrl->val + sc2232->cur_mode->height);
1220
+ if (!ret)
1221
+ sc2232->cur_vts = ctrl->val + sc2232->cur_mode->height;
1222
+ sc2232_modify_fps_info(sc2232);
12001223 dev_dbg(&client->dev, "set vblank 0x%x\n",
12011224 ctrl->val);
12021225 break;
....@@ -1232,6 +1255,7 @@
12321255 break;
12331256 }
12341257
1258
+ctrl_end:
12351259 pm_runtime_put(&client->dev);
12361260 return ret;
12371261 }
....@@ -1303,6 +1327,8 @@
13031327
13041328 sc2232->subdev.ctrl_handler = handler;
13051329 sc2232->has_init_exp = false;
1330
+ sc2232->cur_vts = mode->vts_def;
1331
+ sc2232->cur_fps = mode->max_fps;
13061332
13071333 return 0;
13081334